c**********i 发帖数: 376 | 1 为什么f(3)会调用两次A的constructor?
code如下:
#include
class A
{
public:
A(int n = 0)
: m_n(n)
{
std::cout << 'd';
}
A(const A& a)
: m_n(a.m_n)
{
std::cout << 'c';
}
private:
int m_n;
};
void f(const A &a1, const A &a2 = A())
{
}
int main()
{
f(3);
return 0;
} |
x****k 发帖数: 2932 | 2 在g++下试了下,第一次是生成
const A &a2 = A()
第二次是生成
const A &a1
帮你改了一下,会更加说明问题
#include
class A
{
public:
A(int n = 0)
: m_n(n)
{
std::cout << n << "n";
}
A(const A& a)
: m_n(a.m_n)
{
std::cout << 'c';
}
private:
int m_n;
};
void f(const A &a1, const A &a2 = A(99))
{
}
int main()
{
f(3);
return 0;
}
【在 c**********i 的大作中提到】 : 为什么f(3)会调用两次A的constructor? : code如下: : #include : class A : { : public: : A(int n = 0) : : m_n(n) : { : std::cout << 'd';
|
x****k 发帖数: 2932 | |
v******y 发帖数: 84 | 4 对搞错了,二个都是ref,没有 copy
即使有copy, compiler也会优化的,你看看
void f(const A a1, const A a2 = A())
{
}
也是一样的结果,我以为他问的是为啥不是dcd
dcdc这样的
【在 x****k 的大作中提到】 : 错,没有copy,拿 -O0 测一下就知道了
|
c**********i 发帖数: 376 | 5 那为什么f(3) 会调用A的constructor? 我不理解的是,‘3’明明是 INT type,而f()
的定义是两个&啊,系统为什么没报错,反而开始创建了两个A的object.
【在 v******y 的大作中提到】 : 对搞错了,二个都是ref,没有 copy : 即使有copy, compiler也会优化的,你看看 : void f(const A a1, const A a2 = A()) : { : } : 也是一样的结果,我以为他问的是为啥不是dcd : dcdc这样的
|
v******y 发帖数: 84 | 6 3会调用A(int), 叫implicit construction
如果你不要这样的implicit construction
用
explicit A(int)
()
【在 c**********i 的大作中提到】 : 那为什么f(3) 会调用A的constructor? 我不理解的是,‘3’明明是 INT type,而f() : 的定义是两个&啊,系统为什么没报错,反而开始创建了两个A的object.
|
x****k 发帖数: 2932 | 7 A(int n = 0)
class A take一个int作为constructor的入口参数。这个constructor支持implicit
conversion。
compiler会自动用int 3作为入口参数构造一个隐含的A的object,然后将这个object的
reference(也就是地址)作为入口参数传给f()
这是关于explicit constructor的定义
http://www-01.ibm.com/support/knowledgecenter/SSGH3R_13.1.0/com
这个c++的reference,希望有帮助
http://www-01.ibm.com/support/knowledgecenter/SSGH3R_13.1.0/com
()
【在 c**********i 的大作中提到】 : 那为什么f(3) 会调用A的constructor? 我不理解的是,‘3’明明是 INT type,而f() : 的定义是两个&啊,系统为什么没报错,反而开始创建了两个A的object.
|
d****i 发帖数: 4809 | 8 把你的constructor变成explicit就可以防止implicit conversion:
class A
{
public:
explicit A(int n = 0)
: m_n(n)
{
std::cout << 'd';
}
};
()
【在 c**********i 的大作中提到】 : 那为什么f(3) 会调用A的constructor? 我不理解的是,‘3’明明是 INT type,而f() : 的定义是两个&啊,系统为什么没报错,反而开始创建了两个A的object.
|
v******y 发帖数: 84 | 9 英雄所见略同
不过这些是c++的基础问题
建议楼主看 primer c++ 5 ,看完就是>80%的c/c++人员了
【在 d****i 的大作中提到】 : 把你的constructor变成explicit就可以防止implicit conversion: : class A : { : public: : explicit A(int n = 0) : : m_n(n) : { : std::cout << 'd'; : } : };
|
c**********i 发帖数: 376 | 10 书买了还在看,就是搜起书来有时候太慢,搜Google又很难找准keyword,只能求助这
里了
【在 v******y 的大作中提到】 : 英雄所见略同 : 不过这些是c++的基础问题 : 建议楼主看 primer c++ 5 ,看完就是>80%的c/c++人员了
|
c**********i 发帖数: 376 | 11 got it. thx.
这不是我的code,只是online test 的题
搜了下google coding style,要求一律加explicit keyword
http://google-styleguide.googlecode.com/svn/trunk/cppguide.html
【在 d****i 的大作中提到】 : 把你的constructor变成explicit就可以防止implicit conversion: : class A : { : public: : explicit A(int n = 0) : : m_n(n) : { : std::cout << 'd'; : } : };
|