构造函数 初始化器列表的问题 高手救命!!!

ff5dq4 2006-04-24 02:59:55
class A
{
char a[20];

public:
A(char *ch);
}

A::A(char *ch):a(ch) // 这里是错误的 不能初始化 a[20]
{}

为什么 初始化不了数组啊


明明 可以 在常规初始化数组中 , 这样: char a[20]="2323" 是可以的


2。
还有使用初始化列表 并不能保证 类中所有成员 都在编译阶段 就创建完毕
例如:
class A
{ int a;
public:
A(int _a){a=_a} //这里没使用初始化列表 创建A对象 先在编译阶段 分配空间 然后在程序执行阶
//段才 给 a 赋值 然后才算 创建对象完毕

class B:public A
{
int b;
public
B(int _a,int _b):A(_a),b(_b) //使用了初始化列表但是 A(_a) 中的 a=_a; 是执行阶段的语句
{}

};


实在搞不懂 初始化器 到底是怎么工作的 望高手指点


...全文
250 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ff5dq4 2006-04-24
  • 打赏
  • 举报
回复
A::A(char *ch):a(ch) // 这里是错误的 不能初始化 a[20]
{}
// lz 这里得a是一个数组,而ch是一个指针,两者怎么能初始化。
// 使用字符串拷贝进行操作,如下。
A::A(char *ch)
{
strcpy(a,ch);
}

--------------------------------

strcpy(a,ch);是在程序运行阶段 给数组赋值

我说的是 初始化 :在编译阶段就把 数组的值给设置了

初始化器 不正是 让 变量在编译阶段就被初始化 而设计的吗?
但是这里却不能在编译阶段就初始化数组
langzi8818 2006-04-24
  • 打赏
  • 举报
回复
NO
ff5dq4 2006-04-24
  • 打赏
  • 举报
回复
那么以下这样行么

class A
{
const int a;
char b[20];
public


}

A(int _a):a(_a),b[20]("213123")

这里a(_a) 应该等价于 const int a=_a 而不是 a=_a;

同样 b[20]("213123") 也应该等价于 char b[20]="213123" 而不是 b[20]="213123" ?
逸学堂 2006-04-24
  • 打赏
  • 举报
回复
A::A(char *ch):a(ch) // 这里是错误的 不能初始化 a[20]
{}
// lz 这里得a是一个数组,而ch是一个指针,两者怎么能初始化。
// 使用字符串拷贝进行操作,如下。
A::A(char *ch)
{
strcpy(a,ch);
}

这些都是C方面得基础,lz继续努力。
goodluckyxl 2006-04-24
  • 打赏
  • 举报
回复
实在搞不懂 初始化器 到底是怎么工作的 望高手指点

就是执行初始化,A(_a) 中的 a=_a; 是一样的 执行了伪构造初始化
A::A(char *ch):a(ch) // 这里是错误的 不能初始化 a[20]
这个当然不能初始化,a是char* const类型是不可改变地址常量
a定义成char* a;就可以初始化
yuanchuang 2006-04-24
  • 打赏
  • 举报
回复
char a[20];//a是常量
A::A(char *ch):a(ch)//你这样是把指针的值赋给a,你说能通过吗?

还有,懂了多给点分……
sankt 2006-04-24
  • 打赏
  • 举报
回复
A::A(char *ch):a(ch) // 这里是错误的 不能初始化 a[20]
{}
//============
数组间赋值不能够这样.
必须使用strcpy

可以使用string就好了

class A
{
string a;

public:
A(string str);
}

A::A(string str=""):a(str)
{}


xiaocai0001 2006-04-24
  • 打赏
  • 举报
回复
>> 明明 可以 在常规初始化数组中 , 这样: char a[20]="2323" 是可以的

注意看看你这个是定义数组时就进行初始化
char a[20] = "2323";
那你直接写
a[20] = "2323";
编译器会通过么?

A-De 2006-04-24
  • 打赏
  • 举报
回复
字符串不能这么副值的,去看一下"浅拷贝"和"深拷贝"就能理解^
sharpdew 2006-04-24
  • 打赏
  • 举报
回复
关键是a是个指针常量,至于第二个问题,你说的没错
s2smhfrom2005 2006-04-24
  • 打赏
  • 举报
回复
依我个人理解:C语言中虽然数组名和指针基本上可以换用,但是它们是不同的,char a[20];中a是一个数组名,它已经有20个char空间(a是个指针常量吧)而char *ch中ch是指针变量,它指向一段内存空间,它们之间不可以直接用a=ch;

64,654

社区成员

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

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