#include <string.h>
#include <iostream>
using namespace std;
class String
{
public:
/* Parameterized Constructor */
String(const char* i_ac)
{
cout<<"Parameterized Constructor";
if(i_ac)
{
data = new char [strlen(i_ac) + 1];
strcpy(data,i_ac);
}
else
{
data = new char[1];
*data = '\0';
}
}
//Parametrized constructor ends.
/*Copy Constructor */
String ( String& objTemp )
{
cout<<"Copy Constructor";
data = new char[strlen(objTemp.data) + 1];
strcpy(data,objTemp.data);
}
/*Overloaded Assignment Operator */
String operator=(String& objTemp)
{
if(this == &objTemp)
return objTemp;
//Delete Existing data
delete[] data;
data = new char[strlen(objTemp.data)+ 1];
strcpy(data,objTemp.data);
return *this;
}
friend ostream& operator<<(ostream& out, String& s1);
private :
char* data;
};
ostream& operator<<(ostream& o1, String& s1)
{
o1<<s1.data;
return o1;
}
int main()
{
String s1("Hello");
cout<<"s1"<<s1;
String s2 = s1;
cout<<"\ns2"<<s2;
String s3(); //doubt
cout<<"\ns3"<<s3;
}
在调用String s3()
时,没有调用构造函数(我知道,因为我在每个构造函数中打印)。但是,在以下行上打印s3
会输出1。
为什么不调用构造函数?我怎样才能确定一个人被召唤?
答案 0 :(得分:2)
请注意:尝试铿锵声,它有一些非常好的诊断方法:
t.cpp:64:10: warning: empty parentheses interpreted as a function declaration [-Wvexing-parse]
String s3(); //doubt
^~
t.cpp:65:15: warning: address of function 's3' will always evaluate to 'true' [-Wbool-conversion]
cout<<"\ns3"<<s3;
~~~~ ^~
t.cpp:65:15: note: prefix with the address-of operator to silence this warning
cout<<"\ns3"<<s3;
^
&
2 warnings generated.
答案 1 :(得分:2)
为什么不调用构造函数?我怎样才能确定一个人被召唤?
这不起作用,这不会调用空的ctor,它会创建一个本地方法。
String s3(); //doubt
cout<<"\ns3"<<s3;
要使其工作,请从String s3()中删除();成为String s3;
String s3; // This is the correct form
(我认为这是开始使用C ++时最常见的错误之一)。但请注意,这会触发链接器错误,因为您没有定义空的ctor。我想你想根据那里的if / else条件使用你的“参数化”ctor作为空ctor。要实现此目的,您必须为参数i_ac提供默认值0或NULL。或者,如果您使用的是C ++ 11,请使用nullptr,因为NULL被认为是令人厌恶的。
附注:
但是,在以下行上打印s3会输出1。
这会将s3评估为bool,因此输出'1'的原因。
/*Copy Constructor */
String ( String& objTemp )
这应该写成
/*Copy Constructor */
String ( const String& objTemp )
同样适用于
/*Overloaded Assignment Operator */
String operator=(String& objTemp)
// Add const
String operator=(const String& objTemp)