cpp:struct & class
cpp:struct & class
大多时候它们长得都很像,经常提到的是struct适合成员变量中仅包含数据,而class适合成员变量繁杂、类型多样(比如自定义的类),这其实也可以被struct分配在栈上而class在堆上所解释;还有就是struct的成员默认为public
,class的成员则默认为private
(当然这也是理论上两者之间最基本的区别;你要是说struct不能作为定义模板的参数而class可以、那确实也算)。
至于cpp里的struct和c中struct基本是两个概念了,比如:
- cpp中的struct可以有成员函数、c中struct最多有个函数指针(作用堪比类的构造函数)
- cpp中的struct也有cpp类的默认构造函数全家桶
- cpp中的struct也可以为空(c的struct是不行的),继承、实现多态
cpp里struct为空时打印它的大小也为1,正如空类一样
除了上面提到的,c里sturct是支持函数指针的,也就是下面的写法
struct test{
int (*p)(struct test *this, int a, int b);
};
并不能说明c中的struct可以接受一个函数,事实上test中成员是一个p指针;cpp则完全兼容这种写法
struct的构造函数
#include<iostream>
int main() {
struct test
{
int num;
bool flag;
test(int n, bool t):num(n),flag(t) {
std::cout << num << " " << flag << std::endl;
}
}test1;
test hi = { 3, true };
test hi { 3, true }; //效果同上
system("pause");
return 0;
}
输出结果是3 1
以免万一:
struct test
中的test
是这个结构体的名字、就像类名一样,可以作为一个对象的类型;而该结构体快结束时的test1
是该结构体的一个对象,它不能作为类型名(也就是说只写test1
而不写test
时,我们仅可以调用该结构体的一个对象->test1)
上面的例子中,构造函数并没有什么特别的、只不过相较于正常的初始化它多了一步cout
,要是按照下面写法也是一样的效果
struct test{
int num;
bool flag;
};
int main(){
test hi{3, true}; // 拷贝构造函数
test hi = {3, true}; // 拷贝赋值函数
return 0;
}
struct的继承
一般我们写类的继承时会声明class child : public parent
,是因为类的继承默认为private
,所以struct的继承完全可以用struct child : parent
完成对public
成员的继承
在这个过程中也很容易出现问题,比如struct中并不允许使用virtual
,也就是struct在继承时无法多态;但可以继承成员
结构体能做的,类也能做;类能做的,结构体不一定能做