海康卫视笔试 总结(struct 与 class)

今天答海康的题总体来说比较简单

 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

即总共有六个函数

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章