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在继承时无法多态;但可以继承成员

image-20220918211145767

结构体能做的,类也能做;类能做的,结构体不一定能做

posted @ 2022-09-18 21:14  比萨在哭  阅读(210)  评论(0编辑  收藏  举报