星期三, 七月 11, 2007

C++ 类构造
好久没用C++了,今天正好碰到一个函数返回对象的的问题,解决并顺便复习一下!
函数返回值是一个类,而这个类没有拷贝构造函数,而导致程序运行失败!缺省的赋值是没有办法解决那些在构造函数中的内存或文件等资源的!

class String {
private: char *data;

public:
String()
{
data = new char [10];
};
String(const String &);
String &operator = (const String &); };
String::String(const String &rs)
{
if(this != &rs) {
data = new char[10];
strcpy(this->data, rs.data);
}
}

String &String::operator=(const String & rs)
{
if(this != &rs)
{
delete[]data;
data = new char[10];
strcpy(this->data, rs.data);
}
return *this;
}

int main(int argc, char* argv[])
{
String s1; String s2(s1); //调用拷贝构造
String s3 = s1; //还是调用拷贝构造,为什么不调用赋值=
return 0;
}

String s2(s1);
String s3 = s1;
只是语法形式的不同,意义是一样的,都是定义加初始化,都调用拷贝构造函数。C++语言支持两种语法形式的初始化,就是上面的两种。
注意, String s3 = s1;
跟 String s3;
s3 = s1;
不同。这里则是首先调用默认构造函数初始化s3,然后使用拷贝赋值从s1那里进行拷贝。
而例子中s2和s3的构造过程都没有执行国默认构造函数。
至于为什么不同,不为什么,这就是语法,就好比循环要使用while和for,分支要使用if和switch一样,不能混用。

String c = b; //也是调用拷贝构造函数 而
String c; c = b;//这才是调用operator =
String s3 = s1; //还是调用拷贝构造,为什么不调用赋值= 这是因为这里的“=”不是运算符。它只是一种形式上规定的分隔符。

没有评论: