Q:什么时候会调用拷贝构造函数?
A:1.一个对象以值传递的形式传入函数体(实参传递给形参的实际上是实参的拷贝对象)
2.一个对象以值传递的形式从函数返回(该对象是函数里对象的拷贝)
3.一个对象通过另一个对象初始化
Q:如果我们没有定义拷贝构造函数会出现什么结果?
A:编译器将会生成一个默认的拷贝构造函数,这个拷贝构造函数完成对象的位拷贝(也就是浅拷贝)
Q:什么是浅拷贝?
A:当类A通过类B初始化,类B已经申请了内存,那么类A就会指向类B所申请的内存。如果类B释放掉内存,那么类A中的指针就是野指针了。简单来说就是浅拷贝没有重新申请资源。
为了避免内存泄露,我们应该在拥有指针成员的对象进行拷贝的时候,需要自己定义拷贝构造函数,使拷贝后的对象指针成员拥有自己的内存地址。
Q:什么是深拷贝?
A:一个类拥有资源,当该类的对象发生复制过程,资源重新分配。
Q:如何定义一个构造函数?
A:类A的构造函数需要与类A同名,且不存在返回值(连void也不行)
Q:构造函数如何调用?
A:每创建一个对象都会自动调用构造函数
Q:谈一谈对结构体拷贝的理解
A:创建结构体Student,定义Student型的结构变量t1,t2。
如果使用t1=t2;进行拷贝,那么就是浅拷贝,此时如果结构体内存在指针变量,依旧是指向同一个内存块。
如果使用copy(&t1,&t2),此时为深拷贝,为t1创建了新的内存。
Q:如果存在某结构体A与某结构体B,它们的内部结构是完全一致的,只是内部结构名和结构体名不一样,用哪种方法能最快速实现拷贝?
A:一开始想到的是一个一个字段进行赋值,后来想想如果这个结构体字段非常多,这样做就没有效率。两个结构体内部结构一致,那么它们的存储方式也是一致的,那么可以使用内存复制的方式实现结构体之间的拷贝。即memcpy(&test1,&test2,sizeof(test2的结构体名))
memcpy是从test1的内存地址的起始位置开始拷贝sizeof算出的值的字节数到test2起始位置
Q:既然讲到了拷贝函数,那解释一下memcpy与strcpy的区别
A:memcpy是从后者内存地址的起始位置开始拷贝n(取决于第三个参数)个字节数到前者的起始位置
strcpy则是从后者起始位置开始直到遇到了'\0'结束的这一字符串拷贝到前者
Q:结构体中为什么最好不要用string字符串而是用char数组代替?
A:当我们在实例化结构体后都会使用memset函数将结构体置空,这时候去对结构体内的string赋值就会出现错误。这是为什么呢?因为string内部存在一个指针指向一块内存,内存中存有信息,如果用memset置空,就会发现这个指针变为空指针,就会出现非法访问的错误。
网友评论