第一题验证类中有无该构造函数,如果没有是如何运行的?
(1)类中不存在该构造函数。
(2)创建对象不带参数时调用空参构造函数。
带参数时调用带相应参数列表的构造函数。
#include <iostream>
#include <string>
#include "43.h"
using namespace std;
int main()
{
String s1="asdf";
s1.PutString();
return 0;
}
第二题赋值运算符是如何提供支持和拷贝构造函数有什么区别?
相等时,返回该数据。
不相等时,删除当前对象中的字符串,然后开辟新空间把参数存入,返回当前对象。
拷贝构造函数要先读取做为参数的对象中字符串的长度,而赋值运算符要先删除当前对象中的字符串。
需要定义析构函数,意思就是说类里面有需要手动释放的资源,比如指针那么如果用了默认拷贝构造,指针赋值时,会把两个指针指向同一块内存地址,那么删除一个对象时,另一个指针具有不确定性。
当类成员变量存在动态分配的指针,就需要建立拷贝构造函数和赋值运算符重载。
有如下代码:
#include <iostream>
using namespace std;
class string
{
public:
int i;
string(){cout << "a" << endl;}
string(const char *rhs){cout << "b" << endl;} //拷贝构造函数
~string){cout << "c" << endl;}
};
void test(const char *rhs)
{
}
int main()
{
return 0;
}
如果代码如下如下
string test1;
string test2 = test1;//调用test1的拷贝构造函数初始化对象test2
******************************************
如果代码如下:
string test1,teast2;
string test2 = test1;
不会调用string的拷贝构造函数,因为test2已经被初始化过了,此时如果想要正确对test2赋值,需要重载运算符=
Const sting& operator=(const char *rhs)
{
return *this;
}
第三题下标运算符是不是重载?判断依据?
(1)是重载
(2)如果没有重载,则主函数中“s1[4]”应该写为“s1.itsString[4]”。
当到输出语句中的s1[4]时,调用带const限定的函数。
当到s1[4]='x'时,调用返回类型为char &的函数。