String ....里面有些东西还是不清楚....

titicacahang 2007-08-29 04:44:14
class String
{
public:
String ();
String(const char *str = NULL); // 普通构造函数
String & operator =(const char *str = NULL); // 赋值函数

private:
char *m_data; // 用于保存字符串
};
void main()
{
String str(); //这一行是不会执行...不会调用String(const char *str = NULL); 吗???
String
}

#define NULL 0 #define NULL ((void*)0)

问题: 1. 为什么说
String ();
String(const char *str = NULL); // 普通构造函数
这二个是重复定义...
String() == String(void) 为什么会跟String(const char *str = NULL);重复定义?? void难道是一个char*型?
2..
String str(); //这一行是不会执行...不会调用String(const char *str = NULL); 吗???

3
String::String(const char* str)
{
if(NULL == str)
{
// 不能让新对象的m_data为NULL 为什么不直接使用m_data = NULL;如果这样用的话,会有什么后果??
m_data = new char[1];
*m_data = '\0';
}
else
{
int length = strlen(str);
m_data = new char[length + 1];
strcpy(m_data, str);
}
}

...全文
245 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
littlebad_boy 2007-08-30
  • 打赏
  • 举报
回复
<<String str(); //这一行是不会执行...不会调用String(const char *str = NULL); 吗???
>>这一行如果改成 String str;就会调用构造函数。类的对象申明如果不带参数就是这样。
char str();这样写你应该认识的吧。

<<问题,,难道(void ) 跟const char * str = NULL..一样??
>>不一样的。前者是无参数,正规写法就要用void来填充。后者是个受保护的char指针,处事化为NULL

<<3
String::String(const char* str)
{
if(NULL == str)
{
// 不能让新对象的m_data为NULL 为什么不直接使用m_data = NULL;如果这样用的话,会有什么后果??
>>这样写没有什么后果,只有一个结果。就是每次生成对象的时,都被初始化,如果其他第方调用类的私有化成员数据,那就会出错。

<<1. 为什么说
String ();
String(const char *str = NULL); // 普通构造函数
这二个是重复定义...
>>应该说String和String(NULL),是一样的(严密的说是不是一样无法证明)。所以,编译的时候,由于第二个构造函数把参数初始化NULL了,所以编译的时候被判定为重复定义。这种语法没有实际意义吧???

<<3
String::String(const char* str)
{
if(NULL == str)
{
// 不能让新对象的m_data为NULL 为什么不直接使用m_data = NULL;如果这样用的话,会有什么后果??
/////////////////////////////////////////////////
防止类成员被修改
/////////////////////////////////////////////////

这样写能保护类成员被修改??没有看出来。应该是保护传进的参数吧。如果你改写了str就会出错。

另回答搂主的问题,
<<为什么不直接使用m_data = NULL;如果这样用的话,会有什么后果?
>>这样的用法有点问题,语法没有问题。这样使用的结果是,每次调用此构造化函数时,类成员的私有数据都会被初始化,如果有其他对象还在使用这个数据,就会出错。所以,类的成员的初始化,一般不会在构造函数中进行。

以上。





antterminator 2007-08-30
  • 打赏
  • 举报
回复
1.一个类只能有一个默认构造函数
String (); //这个是默认构造函数不用说了
String(const char *str = NULL); //这里的str有默认参数NULL,也可以当作默认构造函数

2.调用一个类的默认构造函数最好别用(),这样会产生二义性
String str();//编译器会认为你声明了一个无参函数str,返回类型为String

后面的我就不说了
littlebad_boy 2007-08-30
  • 打赏
  • 举报
回复
String & operator =(const char *str = NULL);


NULL是const char *类型??

一些最基本的语法你还没有掌握啊。建议从基本语法学起。

int a = 2;----明白吧。把int a初始化为2

int *a = NULL,------明白吧?定义int a指针,初始化为NULL

char *str = NULL是什么意思???

const是cjiajia的关键字,仔细看看我上面的回答中的说明。

operator =()是重载操作符的语法,=这样操作之后,即相当于一个函数。遇到该类的对象初始化即=之后附值NULL,都毁调用此函数。


taodm 2007-08-30
  • 打赏
  • 举报
回复
int x = 1;
double d = x;
x是double类型的么?
自己要多想啊。

对于那个重复定义问题,你随便去掉一个,在另外一个里加打印。
String s;
你再编译运行看输出。是不是随便去掉一个后都可以?那,2个同时提供,是不是要算重复?
titicacahang 2007-08-30
  • 打赏
  • 举报
回复
对于这个问题
String ();
String(const char *str = NULL); // 普通构造函数
这二个是重复定义...
还有一个就是
void main()
{
String strbb;
strbb = NULL;
}
strbb = NULL;这里会调用String & operator =(const char *str = NULL);
为什么?? NULL是const char *类型??

我从上面的解释来看..还是有点模糊........请高人在解释一下.谢谢

laiwusheng 2007-08-29
  • 打赏
  • 举报
回复
我发现我太搞笑了,连函数都不认识了,>_<
titicacahang 2007-08-29
  • 打赏
  • 举报
回复
问题,,难道(void ) 跟const char * str = NULL..一样??
titicacahang 2007-08-29
  • 打赏
  • 举报
回复
问题1 ..我还是不太明白哦
huzhangyou 2007-08-29
  • 打赏
  • 举报
回复
无语了

String str(); 是声明了一个名字叫str,无参,返回string的函数。

同意

不要为了分啊.....
taodm 2007-08-29
  • 打赏
  • 举报
回复
问题3 ,看(或者考虑一下)String的size/或者length成员的实现,
设计成这样可以简化其它成员函数的实现。
taodm 2007-08-29
  • 打赏
  • 举报
回复
2位兄弟今天没午睡吧。
String str(); 是声明了一个名字叫str,无参,返回string的函数。
laiwusheng 2007-08-29
  • 打赏
  • 举报
回复
4
void main()
{
String strbb;
strbb = NULL;
}
strbb = NULL;这里会调用String & operator =(const char *str = NULL);
为什么?? NULL是const char *类型??
/////////////////////////////////////////////////
NULL在这里是一个常量指针,因为void*能被转化为任何类型指针
/////////////////////////////////////////////////
ouyh12345 2007-08-29
  • 打赏
  • 举报
回复
1、普通构造函数里面,参数str有默认值的,这样,在
String str();
时,编译器不知道该调用哪个构造函数,有二义
laiwusheng 2007-08-29
  • 打赏
  • 举报
回复
1. 为什么说
String ();
String(const char *str = NULL); // 普通构造函数
这二个是重复定义...
String() == String(void) 为什么会跟String(const char *str = NULL);重复定义?? void难道是一个char*型?
/////////////////////////////////////////////////
带默认参数的重载构造
/////////////////////////////////////////////////
2..
String str(); //这一行是不会执行...不会调用String(const char *str = NULL); 吗???
/////////////////////////////////////////////////
不会,编译器自动查找相匹配的构造函数来构造对象
/////////////////////////////////////////////////

3
String::String(const char* str)
{
if(NULL == str)
{
// 不能让新对象的m_data为NULL 为什么不直接使用m_data = NULL;如果这样用的话,会有什么后果??
/////////////////////////////////////////////////
防止类成员被修改
/////////////////////////////////////////////////
titicacahang 2007-08-29
  • 打赏
  • 举报
回复
4
void main()
{
String strbb;
strbb = NULL;
}
strbb = NULL;这里会调用String & operator =(const char *str = NULL);
为什么?? NULL是const char *类型??

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧