c++ 构造函数问题

浏览:64日期:2023-05-07

问题描述

有这样一个构造函数,工作正常,用途就是把参数都放到成员里,

是否有更简洁的写法?

函数内容空着看起来好奇怪。

foo::foo(mytype1 a, mytype2 b, mytypec c) :m_a(a),m_b(b),m_c(c){}

问题解答

回答1:

没有什么简洁写法。。一般我都这么写

foo::foo(t1 a, t2 b, t3 c) :m_a(a) ,m_b(b) ,m_c(c){}

不像perl6可以直接使用命名参数~~

回答2:

据我所知,没有。

回答3:

注意构造函数体不是用于初始化的,其实数据成员的初始化是在函数体之前就完成的。

如果有些数据成员没有默认构造函数的话,你不用初始化列表,在函数体中赋值肯定是不行的。

同样的还有析构函数,数据成员对应析构函数的调用也是在函数体之后完成的。

当然,这样写是有点儿蛋疼,可以让编译器支持某种写法。但是如何兼容旧代码?新的写法有没有可能和其他的代码形式冲突?新的写法会不会给编译器造成很大的难度。毕竟如今C++编译器的前端实现起来已经够难的了!

回答4:

除以下四种情况:

初始化一个reference member。

初始化一个const number。

调用一个base class的constructor,而它拥有一组参数时。

调用一个member class的constructor,而它拥有一组参数时。(From 深度探索C++对象模型)

使用列表初始化和赋值的效果差不太多。所以如果你不习惯构造函数初始化列表的方式,可以采用以下方式初始化:

foo::foo(mytype1 a, mytype2 b, mytypec c){ m_a = a; m_b = b; m_c = c;}

当然要注意开始那四种情况。

回答5:

没有更好的写法,这是风格~

很多时候我们都会需要这种写法,即使是很小的类。

class Father{private: class _Son { public:int i1, i2, i3, i4; }public: auto func() {_Son s;s.i1 = ......; }};

如果你确实不想那么麻烦,而这个类又是private的,那么你就把它当成C的struct用吧(比如那个_Son),就不用构造函数了,你最好给它标为struct,也是风格问题;不然,你损失了优雅、风格以及封装性~后果就是你每次需要这个类型的对象时都要手动给这个类的对象赋值或者写丑陋的init()方法。

回答6:

这种方法是用初始化列表对成员进行初始化,如果在结构体内一一对成员进行赋值,这个赋值过程是先调用默认构造函数(default),然后在进行赋值,效率不如使用初始化列表高

相关文章: