由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 请教各路C++大神 为什么f(3) 输出是 'dd'
相关主题
小问题一个C++ 的问题
C++问题,confusing...关于C++ copy-constructor 一个奇怪的问题
C++里面question about c++ constructor
[合集] C++问题(copy constructor)菜鸟请教smart pointer
关于c++的constructor的面试题Help: who has gcc 4.0 or higher
问一个简单的C++问题which func will be called?
问题请教几个C++问题
请问这个C++程序有什么问题吗怎么搞的?
相关话题的讨论汇总
话题: const话题: int话题: cout话题: std
进入Programming版参与讨论
1 (共1页)
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
3
错,没有copy,拿 -O0 测一下就知道了
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';
: }
: };

1 (共1页)
进入Programming版参与讨论
相关主题
怎么搞的?关于c++的constructor的面试题
一个关于assignment constructor和expection的问题问一个简单的C++问题
请教一个基本的constructor和destrcutor问题问题
请叫一个 template class constructor 的问题请问这个C++程序有什么问题吗
小问题一个C++ 的问题
C++问题,confusing...关于C++ copy-constructor 一个奇怪的问题
C++里面question about c++ constructor
[合集] C++问题(copy constructor)菜鸟请教smart pointer
相关话题的讨论汇总
话题: const话题: int话题: cout话题: std