C++类问题,很基础

killernan 2010-06-01 10:17:50
#include <iostream>
using namespace std;
class Obj {
public:
Obj(int k) :
j(k), i(j) {

}
void print(void){
cout<<i<<endl<<j<<endl;
}
private:
int i;
int j;
};
int main(int argc,char *argv[]) {
Obj obj(2);
obj.print();
return 0;
}

Obj(int k) :j(k), i(j) 这个到底是什么意思?thanks
...全文
129 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
dadun 2010-06-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 fanster28_ 的回复:]
是的,之所以要按照申明的顺序,而不是初始化列表的顺序是因为
C++对像的析构顺序于其构造顺序刚好相反
如果按照初始化列表的顺序初始化,则没一个初始化列表都需要一个表来维护其初始化顺序,
使得其析构的顺序按列表的相反顺序执行,这个开销显然与C++的设计原则相背,所以
初始化列表的顺序按其申明的顺序赋值


引用 7 楼 dadun 的回复:

你要改成

C/C++ code
……
[/Quote]

原来如此...学习了,谢谢!
end 2010-06-01
  • 打赏
  • 举报
回复
那个语句确实是赋值语句
不过运行起来 结果有错误
7楼正解 改变声明顺序后 完全正确
killernan 2010-06-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fanster28_ 的回复:]
C/C++ code

Obj(int k) :j(k), i(j) //这个到底是什么意思?thanks

//其实对于int型来说,参数列表和直接写没有区别
//当k接受一个对象或其引用时,这时候写成阐述列表,编译器可以更好的优化代码,减少不必要的临时变量的产生
//
Obj(string str):s(str)
//你调用Obj("hi"),这个临时变量"hi"就不必存在了
……
[/Quote]
很详细,谢谢,给分
fanster28_ 2010-06-01
  • 打赏
  • 举报
回复
是的,之所以要按照申明的顺序,而不是初始化列表的顺序是因为
C++对像的析构顺序于其构造顺序刚好相反
如果按照初始化列表的顺序初始化,则没一个初始化列表都需要一个表来维护其初始化顺序,
使得其析构的顺序按列表的相反顺序执行,这个开销显然与C++的设计原则相背,所以
初始化列表的顺序按其申明的顺序赋值

[Quote=引用 7 楼 dadun 的回复:]

你要改成

C/C++ code
private:
int j;
int i;



C++中初始化是按照声明顺序,而不是初始化列表的顺序。
[/Quote]
killernan 2010-06-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dadun 的回复:]
你要改成


C/C++ code
private:
int j;
int i;





C++中初始化是按照声明顺序,而不是初始化列表的顺序。
[/Quote]
高手!
fanster28_ 2010-06-01
  • 打赏
  • 举报
回复

Obj(int k) :j(k), i(j) //这个到底是什么意思?thanks

//其实对于int型来说,参数列表和直接写没有区别
//当k接受一个对象或其引用时,这时候写成阐述列表,编译器可以更好的优化代码,减少不必要的临时变量的产生
//
Obj(string str):s(str)
//你调用Obj("hi"),这个临时变量"hi"就不必存在了

//当然这些在现代编译器下变得不那么重要,你不这样写也可以做优化
//上面那个"hi"是右值,被优化很正常
dadun 2010-06-01
  • 打赏
  • 举报
回复
你要改成

private:
int j;
int i;


C++中初始化是按照声明顺序,而不是初始化列表的顺序。
dadun 2010-06-01
  • 打赏
  • 举报
回复
这样初始化好像不行,你调试一下看看。
end 2010-06-01
  • 打赏
  • 举报
回复
Obj(int k) : j(k), i(j)

obj 是构造函数 k 是它的参数 函数的作用是 把K赋值给j 再把j赋值给i
后面就是赋值的意思
killernan 2010-06-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wade_2003 的回复:]
Obj(int k) :j(k), i(j) 这个到底是什么意思?thanks

相当于参数列表吧
[/Quote]
参数列表有什么用? 我看类继承跟这个的写法很相似,有什么区别啊
小楫轻舟 2010-06-01
  • 打赏
  • 举报
回复
注意一下顺序,
Obj(int k) :i(j), j(k) {}是不行的
小楫轻舟 2010-06-01
  • 打赏
  • 举报
回复
初始化,
j = k;
i = j;
wade_2003 2010-06-01
  • 打赏
  • 举报
回复
Obj(int k) :j(k), i(j) 这个到底是什么意思?thanks

相当于参数列表吧

64,684

社区成员

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

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