Redian新闻
>
请教各路C++大神 为什么f(3) 输出是 'dd'
avatar
c*i
2
为什么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;
}
avatar
x*k
3
在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';

avatar
x*k
4
错,没有copy,拿 -O0 测一下就知道了
avatar
v*y
5
对搞错了,二个都是ref,没有 copy
即使有copy, compiler也会优化的,你看看
void f(const A a1, const A a2 = A())
{
}
也是一样的结果,我以为他问的是为啥不是dcd
dcdc这样的

【在 x****k 的大作中提到】
: 错,没有copy,拿 -O0 测一下就知道了
avatar
c*i
6
那为什么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这样的

avatar
v*y
7
3会调用A(int), 叫implicit construction
如果你不要这样的implicit construction

explicit A(int)

()

【在 c**********i 的大作中提到】
: 那为什么f(3) 会调用A的constructor? 我不理解的是,‘3’明明是 INT type,而f()
: 的定义是两个&啊,系统为什么没报错,反而开始创建了两个A的object.

avatar
x*k
8
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.

avatar
d*i
9
把你的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.

avatar
v*y
10
英雄所见略同
不过这些是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';
: }
: };

avatar
c*i
11
书买了还在看,就是搜起书来有时候太慢,搜Google又很难找准keyword,只能求助这
里了

【在 v******y 的大作中提到】
: 英雄所见略同
: 不过这些是c++的基础问题
: 建议楼主看 primer c++ 5 ,看完就是>80%的c/c++人员了

avatar
c*i
12
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';
: }
: };

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。