c++知识点总结--结构体

本文详细介绍了C++中的结构体,包括声明、初始化、内存对齐原则以及结构体在不同场景下的使用,如作为数组、指针、嵌套结构体以及函数参数。此外,还提到了struct与class的区别,以及结构体在内存布局上的优化策略。

结构体

声明时: {;}
初始化时:{,}
结构体声明:

//example:
struct dolly 
{
	char name[20]; 
	float volume; 
	double price;
}; // }inf;

结构体使用:
(struct可以省略)

//example:
struct dolly cat;
dolly hat = {"wwwdfwf",1.88,23.33}; //省略struct 等号也可以省略
//dolly hat("SSS",1.2,23);//必须给出相应有参构造才行。
cat = hat;//copy操作;对成员是地址的结构体还是不要这样copy;会使得两个结构体对象指向同一个地址,类似情况在class中也要考虑,此时应该重写 operator=();
//cat.name;cat.volume 可以来查看,修改,对象的成员值;

结构体数组:
dolly gifts[100]; ---- ---- 创建100个dolly类,即数组的每个元素都是dolly类;

//example
dolly guests[2] = { {"sfwe",0.2,0.4}, {...}, {...},}; 
// dolly guestss[2] ={dolly("ddd",0.2,0.3),...};
guests[0].name="xxx";

struct内存对齐
目的: 为了提高内存的访问效率。
对齐原则:结构体的起始地址能够被其最宽的成员大小整除;结构体每个成员相对于起始地址的偏移要能被自身大小整除(char可以从任何字节地址开始,2字节short必须从偶数地址开始,4字节的int或float必须从被4整除的地址开始,而8字节的long或double必须从被8整除的地址开始。),如果不能,就需要在前一个成员后面补充字节;结构体总体大小能够被最宽的成员的大小整除,如果不能,也要在后面补充。但实际上对齐数 = 编译器默认值与成员自身大小的较小值。

struct A{
	int a;
	char b;
	double c;
};
//int可以从偏移0开始,char b可以从偏移4开始,但是double c不能从偏移5开始,只能从偏移8开始,所以会先补齐3个,到偏移8,结束时的偏移量16,故最终大小为16;
sizeof(A)16字节,而不是4+1+8 = 13字节。

结构体指针:

//example:
dolly hat = {"wwwdfwf",1.88,23.33};//创建结构体变量
dolly * p = &hat;//通过指针指向结构体变量;
cout << p->name << p->volume<<endl;//通过指针访问结构变量的数据,使用->来访问;
dolly* q = new dolly{"dsdf",1.2,22,22};

结构体嵌套结构体:

struct student{
 	string name; 
 	int age; 
 	int score;
 };
struct teacher {
	int id; 
	string name; 
	int age; 
	struct student stu;
	};
teacher t;
t.id =1000;
t.name="li";
t.stu.name="小王";
t.stu.age = 20;

结构体作函数参数:

struct student{ 
	string name; 
	int age; 
	int score;
};
void printStudent1(struct student s){
	std::cout<<s.mame<<std::endl;
} //值传递 (函数中用.调用)
void printStudent2(struct student &s){
	std::cout<<s.mame<<std::endl;
} //引用传递 (函数中用.调用)
void printstudent3(struct student * p ){
 std::cout<<p->name<<std::endl;
 } //地址传递 (函数中用->来调用)
int main()
{
	student s; 
	s.name="xxx";
	s.age=20; 
	s.score = 60;
	printStudent1(s);
	return 0;
}

其他相关知识

struct和class高度相似;但也有所区别:1. struct 默认权限是public;class的默认权限是private;2.struct即使没有对应的构造函数也可以使用{}进行初始化,但是class不行。

//example
struct Student
{
	public://可以不写,默认的
		string name;
		int age;
		Student():name("xsd"),age(10),score(99){};
		Student(string s,int a,double sco):name(s),age(a),score(sco){};
	privatedouble score;//外部无法访问
		
};

Student s;//其中name = "xsd" ; age = 10 ; score(99)

上面例子中在struct的二个构造函数使用到初始化列表的方法 —这种方法只能用于构造函数,class或者struct

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值