自学C++菜鸟,遇到了一点看不懂,麻烦各路大侠看看

AXUBOD 2012-08-09 10:47:38
从学C语言过来的,以前没看过这种赋值状况,希望各位能帮我详解一下谢谢了,代码如下,各位可以尽情的补充和扩展,越多越好,让后来人能有收获
class cbook
{
public:
char m_bookname[128];
const unsigned int m_price;
int m_chapternum;
cbook()//从这里到最后的赋值以前从未见过,请从这里开始解答
:m_price(32),m_chapternum(15)
{
strcpy(m_bookname,"大学英语");
}
}
...全文
158 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzmsix 2012-08-09
  • 打赏
  • 举报
回复
构造函数初始化列表法赋默认值
LL_zhuo 2012-08-09
  • 打赏
  • 举报
回复
这个我们老师有讲过,
对于c++而言,在用构造函数对类里面的数据成员进行初始化的时候有两种方法进行赋值,
一种是在函数体内用赋值号,
就像 变量名=要赋予的值;
一种是在函数名后用初始式进行赋值,
语法是
函数名 :变量名(要赋予的值)
{
/函数体/
}
如果一个函数有多个初始式,用","进行连接,

函数名 :变量名(要赋予的值),变量名(要赋予的值)
{
/函数体/
}
一般变量的话,两种赋值方法都可以,
但是对于类里面的静态数据成员和常量数据成员,要想赋初值的话只能在函数体外进行,
常量数据成员就是用初始式这样的形式来赋初值,一般这种语法都是用于在运行是动态赋予常量数据成员初值,
注意类只是对某种结构以及相应的方法的一个声明而已,
就像类里面的数据成员,只有当你创建一个类的对象时系统才会根据类里面数据成员的定义构造出相应的变量。
用你的代码举个栗子,
int book_price=1;
cbook()//利用book_price的值对const变量赋初值
:m_price(book_price),m_chapternum(15)
{
strcpy(m_bookname,"大学英语");
}
int main()
{
cbook book1;
++book_price;
cbook book2;
}
这样的话运行时系统先调用cbook的构造函数,建立book1里数据成员相应的变量并赋初值,所以book1里m_pirce值为1,book2里值为2.
如果你在编译器里直接敲打int const m_price=book_price;的话是不可以的,因为这相当此时你已经定义了一个const的int型常量,而const是不允许在编译阶段用一个变量来给它赋值的,如果你在类的声明中写这句话就更不可以了,因为类仅仅是声明,不能够定义任何东西。
(变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程
序中,变量有且仅有一个定义。
声明用于向程序表明变量的类型和名字。定义也是声明:当定义变量时我们
声明了它的类型和名字。可以通过使用extern 关键字声明变量名而不定义它。----c++primer第四版)
写的有点乱,我也是初学者,嘿嘿,希望能帮到你
lylm 2012-08-09
  • 打赏
  • 举报
回复
构造函数能使用初始化列表就不要赋值,会有更好的效率,m_bookname因为要调用函数不能初始化
cbook()//从这里到最后的赋值以前从未见过,请从这里开始解答
:m_price(32),m_chapternum(15)
{
strcpy(m_bookname,"大学英语");
}
}
AXUBOD 2012-08-09
  • 打赏
  • 举报
回复
拜托,我真的是不得已,我没有书啊,知道的就帮忙解释一下吧,感激不尽
AXUBOD 2012-08-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

const变量也是可以赋初值的。

引用 4 楼 的回复:

看到我那个 m_price 前面有个const了吗??我现在就是想弄懂上面的方法,不要同理的
[/Quote]
我试了一下,会出错的,你也可以试下啊
xu6148152 2012-08-09
  • 打赏
  • 举报
回复
多看看书吧。基础知识。
kingdom_0 2012-08-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
看到我那个 m_price 前面有个const了吗??我现在就是想弄懂上面的方法,不要同理的
[/Quote]
非static 的 const 类型的变量,必须要在初始化列表中初始化。
const 修饰的变量,在对象生成后,值不能被修改
图灵狗 2012-08-09
  • 打赏
  • 举报
回复
const变量也是可以赋初值的。

[Quote=引用 4 楼 的回复:]

看到我那个 m_price 前面有个const了吗??我现在就是想弄懂上面的方法,不要同理的
[/Quote]
翅膀又硬了 2012-08-09
  • 打赏
  • 举报
回复
C++的构造函数赋值,有两种写法,一种是你那样写,一种是3楼这样写。
AXUBOD 2012-08-09
  • 打赏
  • 举报
回复
看到我那个 m_price 前面有个const了吗??我现在就是想弄懂上面的方法,不要同理的
图灵狗 2012-08-09
  • 打赏
  • 举报
回复
这是构造函数的简化赋值,把它展开相当于:

cbook::cbook()
{
m_price = 32;
chapternum = 15;
strcpy(m_bookname, "大学英语");
}
AXUBOD 2012-08-09
  • 打赏
  • 举报
回复
我知道啊。。。但是我没看过这种方法啊。。能解释清楚吗??
我以前我的是C,现在自学C++,C上面的赋值都是int i=3;这种的就是没看过上面这种的
ouyh12345 2012-08-09
  • 打赏
  • 举报
回复
初始化列表
AXUBOD 2012-08-09
  • 打赏
  • 举报
回复
我下了,只是没有去看
看着捉急 2012-08-09
  • 打赏
  • 举报
回复
你能上网 就可以下pdf文件嘛
独酌逸醉 2012-08-09
  • 打赏
  • 举报
回复
找本书看看!
看着捉急 2012-08-09
  • 打赏
  • 举报
回复
c++ primer是本经典
看着捉急 2012-08-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

这是构造函数的简化赋值,把它展开相当于:
C/C++ code

cbook::cbook()
{
m_price = 32;
chapternum = 15;
strcpy(m_bookname, "大学英语");
}
[/Quote]
这个说法是不准确的,这个的确是初始化列表,但不是简单的展开,初始化列表里面的初始化是在花括号之前执行的,而且效率比放在花括号里面的初始化高,速度更快,不管有没有显式的初始化化列表,总是会先执行初始化列表。

还有const表示常量,const int a = 1; 表示变量a的内容不能改变,因此他必须被初始化 const int a;就不对,const关键还是要看与引用和指针一起使用,注意区分。推荐你看c++ primer这本书,里面我提到的这些都很详细

64,646

社区成员

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

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