Last Updated: 2023-12-25 07:47:28 Monday
-- TOC --
C语言的struct,只是一块包含各种数据的内存。在现代C++中,struct已经扩展成跟class差不多的功能,即struct就是在定义一个类。
在C++中我们可以看到struct和class的区别并不是很大,两者之间有很大的相似性。那么为什么还要保留struct,这是因为C++是向下兼容的,兼容C。
struct在C语言中,是一块内存,而在C++中,它是一个对象。
在C++中定义struct,可以省略typedef
关键词。
下面这个.c文件,用gcc编译不过,但是用g++可以编译通过:
#include <stdio.h>
struct ta {
int a;
int b;
};
int main(void) {
ta a{};
a.a = 1;
a.b = 2;
printf("%d %d\n", a.a, a.b);
return 0;
}
以C++的视角,struct就是class,上面的代码,如果把struct替换成class,一样的:
#include <stdio.h>
class ta {
public:
int a;
int b;
};
int main(void) {
ta a;
a.a = 1;
a.b = 2;
printf("%d %d\n", a.a, a.b);
return 0;
}
唯一的区别就是,struct的成员默认都是public,class成员默认都是private,因此上面的示例代码,补上public关键词。(理解public,protected和private)
既然struct已经是一种class了,除了各种fundamental的数据类型定义外,还就是定义成员函数接口。
#include <stdio.h>
struct ta {
ta(int a, int b):
a{a},
b{b} {
}
void show() {
printf("%d %d\n", a,b);
}
private:
int a;
int b;
};
int main(void) {
ta a{1,2};
a.show();
return 0;
}
将a和b设置为private后,用public的show接口显示出来。以上代码对a和b的初始化,使用到了C++的初始化列表技术。
既然struct已经成为了一种class,那么,就来说说它的访问权限。
回顾一下class的访问权限
struct与class的区别是:
默认权限都是public,默认public继承!(struct继承class,默认也是public)
#include <stdio.h>
struct ta {
ta(int a, int b):
a{a},
b{b} {
}
int a;
int b;
};
struct tb: ta {
tb(int a, int b):
ta{a,b} {
}
};
int main(void) {
tb b{3,5};
printf("%d %d\n", b.a, b.b);
return 0;
}
tb默认用public的方式继承ta,因此a和b都可以直接访问。
ta也可以是class,只是需要使用显式的public:
#include <stdio.h>
class ta {
public:
ta(int a, int b):
a{a},
b{b} {
}
int a;
int b;
};
struct tb: ta {
tb(int a, int b):
ta{a,b} {
}
};
int main(void) {
tb b{3,5};
printf("%d %d\n", b.a, b.b);
return 0;
}
如果把tb改成class,就要写成这样:
#include <stdio.h>
struct ta {
ta(int a, int b):
a{a},
b{b} {
}
int a;
int b;
};
class tb: public ta {
public:
tb(int a, int b):
ta{a,b} {
}
};
int main(void) {
tb b{3,5};
printf("%d %d\n", b.a, b.b);
return 0;
}
class很保守,默认都是private!struct很开放,为了兼容C也没办法,默认都是public!
本文链接:https://cs.pynote.net/sf/c/cpp/202208121/
-- EOF --
-- MORE --