请教一个c++中的构造函数的调用问题.

来源:百度知道 编辑:UC知道 时间:2024/05/12 06:59:28
#include<iostream>
using namespace std;
class Str
{
private:
char str[34];
public:
Str(){cout<<"ctor ."<<endl;strcpy(str,".");}
Str(char *x){cout<<"ctor "<<x<<endl;strcpy(str,x);}
~Str(){cout<<"dtor "<<str<<endl;}

};
int main()
{
//-----------------------------------1------------------------------------------------

-------
Str s1="I love you!";//初始化语句,调用构造函数. 为什么这里调用的是带参数的构造函数, 而不是

无参数的构造函数???????????????????????
Str s2;//初始化语句,调用构造函数
//-----------------------------------2------------------------------------------------

----------
s2=s1;//赋值语句,不调用构造函数
return 0;
}

注: 问题见问号处.
按一楼的说法, 是明白多了.谢谢大家的帮助.
可是新问题又来了: Str s1="I love you!";//因为你提供了一个参数,这里是 "I love you!" ---------------这个解释怎么理解??? 这里

Str s1="I love you!";
//因为你提供了一个参数,这里是 "I love you!"
所以根据匹配原则,与有一个参数的构造函数相匹配,进而调用它

Str s2;
//没有提供实参,所以调用你定义的默认的构造函数
s2=s1;
//这里也是要调用构造函数的,它调用的是复制构造函数,因为你没有定义
复制构造函数,所以编译器帮你合成一个默认的复制构造函数,调用这个复制构造函数,用s1来初始化s2

复制构造函数这样定义:
Str(const Str&){}

学过函数重载吧。
编译器会根据你传递给函数的参数,自动匹配一个合适的函数。

s1 = "I love you";
这个会进行类型转换。
相当于: char c = 'a'; int x = c; 一样。
会发生隐式转换,后面章节会有说明的。C++书中都会说。
为了防止隐式转换,可以加explicit用于说明,不能进行隐式转换
这样上面的式子就不会成功了。

关于
s2 = s1;
它会调用拷贝构造函数,你并没有定义一个拷贝构造函数,编译器会调用一个默认的拷贝构造函数。

只能解释到这里了,要更详细的解释,请看书吧。现在不懂,以后看多了也会懂的。

其实你第一次调用也就是声明Str s1 = "i love you " 的时候, = 号不是赋值的意思,就是构造,意思和Str s1("i love you !")意思是一样的,如果你声明过了,第二次用 = 号就是赋值了。。两次意义不一样的。。。

对象在出事花的时候要调用构造函数,在定义对象的时候,=和()都是表示的初始化,相当于你给构造函数提供了一个“I love you!”.