初始化与赋值的区别

时间:2022-09-04 19:49:23
1,初始化与赋值
初始化是从无到有的过程,先分配空间,然后再填充数据;
赋值是对己有的对象进行操作。
对于基本数据类型,二者是没有任何区别,对于非基本数据类型,在写法与效率上有许多不同。
memset函数原型
#include <string.h>
void *memset(void *s, int c, size_t n);
表明将s指向的n个大小的区域,初始化值为c
2,结构体初始化与赋值
定义结构体:
struct student{
 char name[30];
 int age;
};
初始化:student stu = {};或student stu = {0};或student stu = {"abdc",30};
前两种初始化方式类似memset(&stu,0,sizeof(stu));
赋值:student stu;
 stu.age = 30;
 char str[] = "abc";
 strcpy(stu.name,str);
3,C字符串
C字符串是一个字符数组,以规定的字符'\0'作为结束标志符。
初始化:
char c[] = {"happy"};
char c[] = "happy";
char c[] = {'h','a','p','p','y','\0'}; // 以上三种方式是等价的。
如果初始化一个空串,char c[10] = {0};与memset(c,0,sizeof(c))的效果一致。
赋值:
如果同为char类型,则可以采用strcpy函数,不同类型则采用memcpy函数。
char c[20];
char str[] = "i am happy!";
strcpy(c,str,strlen(str)); // 将str的值赋给c
4,C++字符串对象
string对象是在std标准库中提供的,使用须包含头文件件及命名空间。
初始化:
string s1; // 默认构造函数,s1为空串
string s2(s1); // 将s2初始化为s1的一个副本
string s3("value"); // 将s3初始化为一个字符串字面值副本
string s4(n,'c'); // 将s4初始化为字符'c'的n个副本
赋值:
string s1("value");
string s2;
s2 = s1; // 将s2字符串赋值给s1
5,自定义对象初始化
自定义对象是指自定义的类。
初始化列表:
构造函数初始化列表以一个冒号开始,接着产以逗号分隔的数据成员列表,每个数据成员后面跟着一个放在括号中的初始化式。
有几种情况必须使用初始化列表进行初始化,如类成员为const类型、类成员为引用类型等,后续待补充。
构造函数赋值初始化:
在构造函数体内使用赋值语句进行初始化。
性能比较分析:结果上相同,但在性能上有很大的差别。因为类类型的数据成员对象在进入函数体前己经构造完成,也就是说在成员初始化
列表处进行对象的构造工作,调用构造函数,在进入函数体之后,进行的是对己构造好的类对象赋值,又调用个拷贝赋值操作符
才能完成(如果并未提供,则使用编译器默认的按成员赋值行为)。