今天答海康的题总体来说比较简单
1、一个类定义为定义struct sEmpty{},编译器会为它添加几个默认函数?
结构体也有自己的构造、析构、重载运算符河函数,可以简单的认为结构体是类的一种形式。
struct Student
{
string name;
int age;
};
struct Student stu = {"liming", 18};
struct Student stu2 = {"wanger", 20};
stu2 = stu;
cout<<"age is : "<< stu2.age <<endl;
cout<<"name is :"<< stu2.name<<endl;
说明此时的拷贝是成功的,此时的结构体可以通过“=”来直接进行赋值操作,但是接下来的问题产生了,假设存在如下的结构体:
struct stu
{
int i;
char c;
char* p;
};
执行下面的程序:
struct stu s1,s2;
char * str = "rabbit is cute";
s1.i = 345;
s1.c = 'y';
s1.p = (char*)str;
s2 = s1;
printf("s2 %d, %c, %s\n", s2.i, s2.c, s1.p);
printf("s1 ptr: %d, s2 ptr : %d\n", s1.p, s2.p);
产生的结果是这样的:
s2 345, y, rabbit is cute
s1 ptr: 7934, s2 ptr : 7934
这说明指针的并没有将内容复制一块给新指针来指向,只是让新指针指向原来的那个内存,这样就相当于,指针在这个复制的过程中只是复制了地址,而不是内容
在结构体中加入自己的拷贝构造函数:
struct stu
{
int i;
char c;
char* p;
stu operator=(stu& stuTmp)
{
i = stuTmp.i;
c = stuTmp.c;
p = new char(strlen(stuTmp.p) + 1);
strcpy(p, stuTmp.p);
return *this;
};
};
相当于重载operator=方法,这样还是运行,产生的结果就是这样的:
s2 345, y, rabbit is cute
s1 ptr: 7910, s2 ptr : 1050000
struct和class最根本的区别就是默认的成员属性不同,其他的时候可以互换
注意:
在 C++ 中,struct 可以同 class 一样拥有自己的成员,只不过 struct 成员的访问默认的是 public 范围。如果在 struct 中定义了构造函数,则默认构造函数(无参构造函数)必须显示定义才能使用。否则,在创建此结构体的实例时,会出现编译错误。
struct Test {
int a;
char* b;
};
Test* test = new Test; // 结构体使用默认构造函数,编译通过
struct Test1 {
Test1(int a):_a(a) {}
int _a;
};
struct Test2 {
Test1 t1;
};
Test2* test2 = new Test2; // 结构体 Test1 没有显示定义无参构造函数,调用失败,编译不通过
Test1 中没有显示的定义无参构造函数,而生成实例的方法却调用的是无参构造。解决方法有:1. 为 Test1 定义默认构造函数; 2. 将 Test1 数据成员声明为指针类型(此时 Test2 结构体中存储的是 Test1 的4字节地址,不需要调用 Test1 的构造函数)。
// 提供默认构造函数
struct Test1 {
Test1():_a(0) {}
Test1(int a):_a(a) {}
int _a;
};
// 数据成员声明为指针
struct Test2 {
Test1* t;
};
此时编译即可通过。
c++空类默认有六个函数
默认构造函数、默认拷贝构造函数、默认析构函数、默认赋值运算符 这四个是我们通常大都知道的。但是除了这四个,还有两个,那就是取址运算符和 取址运算符 const
即总共有六个函数。