C++零基础——C与C++结构体的区别

by LauCyun Jun 18,2015 11:42:49 15,488 views

分析C与C++结构体的区别。


1、C++结构体可以为空,而C不可以为空。

C:
struct MyStruct
{
	//error C2016: C 要求一个结构或联合至少有一个成员   
};
 
C++:
struct MyStruct
{
	
};

2、C++结构体可以初始值,而C不能初始值。

C:
struct MyStruct
{
	int num = 10;//error C2143: 语法错误 : 缺少“;”(在“=”的前面)
};

C++:
struct MyStruct
{
	int num = 10;//C++结构体可以初始化值
};

3、定义变量时,C++结构体无需关键字struct,而C需要关键字struct。

C:
struct MyStruct
{
	int num;
};
int main()
{
	//MyStruct my1; //error C2065: “MyStruct”: 未声明的标识符
	struct MyStruct my1; //定义一个my1变量
	return 0;
}


C++:
struct MyStruct
{
	int num = 10;
};
int main()
{
	MyStruct my1;
 //定义一个my1变量
	return 0;
}

4、C++结构体成员可以是函数,而C不可以。

C:
struct MyStruct
{
	int num;
	void fun()  //error C2032: “fun”: 函数不能是 struct“MyStruct” 的成员 
	{
	}
};

C++:
struct MyStruct
{
	int num;
	void fun() //C++结构体成员可以有函数
	{
	}
};

5、C++结构体成员可以是函数指针,也可是lambda函数块,但是代码体积不计入大小。

#include<iostream>
#include<functional>
using namespace std;

struct MyStructX1
{
	void(*p)() = []() {};
};
struct MyStructX2
{
	function<void(void)>  fun1 = []() {};
};
struct MyStructX3
{
	void(*p)() = []() {};
	function<void(void)>  fun1 = []() {};
	function<void(int)>  fun2 = [](int a) {};
};
struct MyStructX4
{
	void(*p)() = []() {};
	function<void(void)>  fun1 = []() {};
	function<void(int)>  fun2 = [](int a) {};
	function<void(double)>  fun3 = [](int a) {};
	function<void(char *)>  fun4 = [](char*str) {cout << "hello " << str; };
};

int main()
{
	//一个函数指针x86中占4个字节,x64占8个字节
	cout << sizeof(MyStructX1) << endl; //4,8
	//在vs2013中一个fun函数包装器x86中占24个字节,x64中占32个字节
	//在vs2015中一个fun函数包装器x86中占40个字节,x64中占64个字节
	cout << sizeof(MyStructX2) << endl;	//24,32
	cout << sizeof(MyStructX3) << endl; //56,72
	cout << sizeof(MyStructX4) << endl; //104,136
	return 0;
}
在vs2013中一个fun函数包装器x86中占24个字节,x64中占32个字节。
在vs2015中一个fun函数包装器x86中占40个字节,x64中占64个字节。


6、C++结构体默认公有,可以设置私有。

struct MyStruct
{
private:  //默认public
	int num = 3;
	function<void(void)>  fun = []() {};
	void go()
	{
	}
};

7、C++结构体中成员是 public 时的初始化方法。

#include<iostream>
using namespace std;

struct point
{
	int x;
	int y;
};

int main()
{
	point p1{ 101, 102 }; //初始化结构体
	point *p2 = new point{ 201, 202 }; //初始化结构体指针
	point p3[2] = { { 310, 320 }, { 330, 340 } }; //初始化结构体数组
	point *p4 = new point[2]{{ 410, 420 }, { 430, 440 } }; //初始化结构体指针数组
	return 0;
}

8、C++结构体中成员是 private 时的初始化方法。

#include<iostream>
using namespace std;

struct sizeit
{
private:
	int x;
	int y;
public:
	//构造函数
	sizeit(int a, int b) :x(a), y(b)//用a初始化x,b初始化y
	{
	}
	void show()
	{
		cout << "x=" << x << ",y=" << y << endl;
	}
};

int main()
{
	sizeit s1(1, 2);
	s1.show();  //x=1,y=2
	sizeit *ps1 = new sizeit(3, 4);//指针
	ps1->show(); //x=3,y=4
	sizeit s2[3]{ sizeit(13, 14), sizeit(23, 24), sizeit(33, 34) };//数组
	s2[0].show(); //x=13,y=14
	sizeit *ps2 = new sizeit[3]{ sizeit(13, 14), sizeit(23, 24), sizeit(33, 34) };//堆上数组
	(ps2 + 1)->show(); //x=23,y=24
	
	sizeit s3(888,999);
	sizeit s4 = s3; //赋值拷贝,无论私有或者公有
	//cout << s4.x << s4.y << endl;//error C2248: “MyStruct::x”: 无法访问 private 成员(在“sizeit”类中声明)
	s4.show();

	return 0;
}

9、C++结构体中,结构体的声明的前提是只能创建指针、引用,用于拓展结构体作用范围。

#include<iostream>
using namespace std;

struct MyStruct; //结构体的声明
MyStruct *p;     //创建结构体指针
MyStruct my1;    //error C2079: “my1”使用未定义的 struct“MyStruct”
void show(MyStruct & my) //创建结构体引用
{
}
struct MyStruct
{
	int num = 10;
	double db;
};

10、C++结构体内部,可以创建引用或者指针

struct MyStruct
{
	int num = 10;
	double db;
	//struct MyStruct s1; //error C2460: “MyStruct::s1”: 使用正在定义的“MyStruct”
	struct MyStruct *p;   //创建结构体指针
	struct MyStruct &rp;  //创建结构体引用
};

11、C++匿名结构体成员不可以初始化。

struct
{
	double db;
	//int num =10; //error C2905: “<unnamed-tag>::num”: 非类范围内的匿名联合的成员不允许类内初始值设定项
};

12、C++结构体,可以继承,也可以多态。

(1)结构体继承:

#include<iostream>
using namespace std;
struct parent
{
	virtual void show()
	{
		cout << "parent" << endl;
	}
};
struct children : public parent
{
};

int main()
{
	//结构体可以继承
	children x;
	x.show(); //parent
	return 0;
}

(2)结构体多态:

#include<iostream>
using namespace std;
struct parent
{
	virtual void show()
	{
		cout << "parent" << endl;
	}
};
struct children : public parent
{
	void show()
	{
		cout << "children" << endl;
	}
};

int main()
{
	//多态
	parent *p = new parent;
	p->show();  //parent
	p = new children;
	p->show();  //children
	return 0;
}


Tags