数组对象初始化问题

we_sky2008 2010-02-01 12:19:53
问题在注释处,
谢谢大家!

#include<iostream>

using namespace std;

class A
{
public:
A() : x(0), y(0){cout<<"缺省构造函数"<<endl;}
A(int a, int b) : x(a), y(b){cout<<"普通构造函数"<<endl;}
//A(int a = 0, int b = 0) : x(a), y(b){cout<<"普通构造函数"<<endl;}//此构造函数与上面两个构造函数等价吗?

A(const A &other) : x(other.x), y(other.y){cout<<"拷贝构造函数"<<endl;}
private:
int x;
int y;
};

void test()
{
A objarray1[2] = /**此处会报错,但构造函数若该为注释掉的有缺省参数的构造函数则不会报错,怎么回事?**/
{
(1, 2),
(3, 4)
};
A objarray2[2] =
{
A(5, 6),
A(7, 8)
};
}

int main()
{
test();
system("pause");
return 0;
}
...全文
127 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengzhixi 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 we_sky2008 的回复:]
这种初始化方式只适用于单参数构造函数吗?
[/Quote]

含有默认实参的构造函数也适合的
stardust20 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 we_sky2008 的回复:]
引用 14 楼 microsky2813 的回复:
为什么你会扣这样的东西呢?A(1, 2)多好

呵呵
我觉得:
A(1, 2)这种先调用构造函数构造一临时对象
再调用拷贝构造函数
效率低了点
[/Quote]
这边 A objarray2[2] =
{
A(5, 6),
A(7, 8)
};
我用vs2008调的时候 也没调用拷贝构造函数
we_sky2008 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 microsky2813 的回复:]
为什么你会扣这样的东西呢?A(1, 2)多好
[/Quote]
呵呵
我觉得:
A(1, 2)这种先调用构造函数构造一临时对象
再调用拷贝构造函数
效率低了点
MicroSky2813 2010-02-01
  • 打赏
  • 举报
回复
为什么你会扣这样的东西呢?A(1, 2)多好
we_sky2008 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 stardust20 的回复:]
A(int a = 0, int b = 0) : x(a), y(b){cout < <"普通构造函数" < <endl;}//此构造函数与上面两个构造函数等价吗?

用这个没报错的原因是:
  A objarray1[2] = /**此处会报错,但构造函数若该为注释掉的有缺省参数的构造函数则不会报错,怎么回事?**/
    {
        (1, 2),//这边括号里面进行了,号运算,得到2然后,用a=2 b=0构造了对象
        (3, 4)
    };

[/Quote]
这种初始化方式只适用于单参数构造函数吗?
we_sky2008 2010-02-01
  • 打赏
  • 举报
回复
找到原因了
结贴了!
we_sky2008 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 microsky2813 的回复:]
引用 8 楼 we_sky2008 的回复:
引用 6 楼 microsky2813 的回复:
    A objarray1[2] = /**此处会报错,但构造函数若该为注释掉的有缺省参数的构造函数则不会报错,怎么回事?**/
    {
        (1, 2),
        (3, 4)
    };

这么做不对吧(1, 2) 与 A(1,2)完全两回事


我觉得只提供构造参数效率会高点
不然还要先构造临时对象再掉用拷贝构造函数来初始化数组元素


我一直不知道有这种语法,看我9楼的简单测试
        (1, 2),
        (3, 4)
传的参数变成了
2 0
4 0
[/Quote]

这种只适用于单参数构造?
太奇怪了!
MicroSky2813 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 we_sky2008 的回复:]
引用 6 楼 microsky2813 的回复:
    A objarray1[2] = /**此处会报错,但构造函数若该为注释掉的有缺省参数的构造函数则不会报错,怎么回事?**/
    {
        (1, 2),
        (3, 4)
    };

这么做不对吧(1, 2) 与 A(1,2)完全两回事


我觉得只提供构造参数效率会高点
不然还要先构造临时对象再掉用拷贝构造函数来初始化数组元素
[/Quote]

我一直不知道有这种语法,看我9楼的简单测试
(1, 2),
(3, 4)
传的参数变成了
2 0
4 0
MicroSky2813 2010-02-01
  • 打赏
  • 举报
回复
#include <iostream>

using namespace std;

class A
{
public:
A() : x(0), y(0){cout <<0<<0<<"缺省构造函数" <<endl;}
//A(int a, int b) : x(a), y(b){cout <<"普通构造函数" <<endl;}
A(int a = 0, int b = 0) : x(a), y(b){cout <<a<<b<<"普通构造函数" <<endl;}//此构造函数与上面两个构造函数等价吗?

A(const A &other) : x(other.x), y(other.y){cout <<"拷贝构造函数" <<endl;}
private:
int x;
int y;
};


void test()
{
A objarray1[2] = /**此处会报错,但构造函数若该为注释掉的有缺省参数的构造函数则不会报错,怎么回事?**/
{
(1, 2),
(3, 4)
};
A objarray2[2] =
{
A(5, 6),
A(7, 8)
};
}

int main()
{
test();
system("pause");
return 0;
}


2 0
4 0
5 6
7 8
we_sky2008 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 microsky2813 的回复:]
    A objarray1[2] = /**此处会报错,但构造函数若该为注释掉的有缺省参数的构造函数则不会报错,怎么回事?**/
    {
        (1, 2),
        (3, 4)
    };

这么做不对吧(1, 2) 与 A(1,2)完全两回事

[/Quote]
我觉得只提供构造参数效率会高点
不然还要先构造临时对象再掉用拷贝构造函数来初始化数组元素
we_sky2008 2010-02-01
  • 打赏
  • 举报
回复
我之所以这样做是觉得像这样:

A objarray1[2] = /**此种初始化方式:在每个数组元素上调用普通构造函数**/
{
(1, 2),
(3, 4)
};
A objarray2[2] = /**此种初始化方式:先创建临时对象,再在每个数组元素上调用拷贝构造函数来初始化该元素,效率较低**/
{
A(5, 6),
A(7, 8)
};
MicroSky2813 2010-02-01
  • 打赏
  • 举报
回复
A objarray1[2] = /**此处会报错,但构造函数若该为注释掉的有缺省参数的构造函数则不会报错,怎么回事?**/
{
(1, 2),
(3, 4)
};

这么做不对吧(1, 2) 与 A(1,2)完全两回事
stardust20 2010-02-01
  • 打赏
  • 举报
回复
A(int a = 0, int b = 0) : x(a), y(b){cout < <"普通构造函数" < <endl;}//此构造函数与上面两个构造函数等价吗?

用这个没报错的原因是:
A objarray1[2] = /**此处会报错,但构造函数若该为注释掉的有缺省参数的构造函数则不会报错,怎么回事?**/
{
(1, 2),//这边括号里面进行了,号运算,得到2然后,用a=2 b=0构造了对象
(3, 4)
};
we_sky2008 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 we_sky2008 的回复:]
引用 1 楼 mstlq 的回复:
这个叫做“一个顶两”……
C/C++ codeclass A
{public:
    A() : x(0), y(0){cout < <"缺省构造函数" < <endl;}
    A(int a,int b) : x(a), y(b){cout < <"普通构造函数" < <endl;}
   
    A(const A&other) : x(other.x), y(other.y){cout < <"拷贝构造函数" < <endl;}private:int x;int y;
};

或者
C/C++ codeclass A
{public:
    A(int a=0,int b=0) : x(a), y(b){cout < <"普通构造函数" < <endl;}
   
    A(const A&other) : x(other.x), y(other.y){cout < <"拷贝构造函数" < <endl;}private:int x;int y;
};
都可以


谢谢!
但是在VC6.0上用第一种会报错的!
[/Quote]
在初始化数组对象时:
A objarray1[2] = /**此处会报错**/
{
(1, 2),
(3, 4)
};
we_sky2008 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mstlq 的回复:]
这个叫做“一个顶两”……
C/C++ codeclass A
{public:
A() : x(0), y(0){cout<<"缺省构造函数"<<endl;}
A(int a,int b) : x(a), y(b){cout<<"普通构造函数"<<endl;}

A(const A&other) : x(other.x), y(other.y){cout<<"拷贝构造函数"<<endl;}private:int x;int y;
};

或者
C/C++ codeclass A
{public:
A(int a=0,int b=0) : x(a), y(b){cout<<"普通构造函数"<<endl;}

A(const A&other) : x(other.x), y(other.y){cout<<"拷贝构造函数"<<endl;}private:int x;int y;
};
都可以
[/Quote]

谢谢!
但是在VC6.0上用第一种会报错的!
we_sky2008 2010-02-01
  • 打赏
  • 举报
回复
primer上面说可以提供构造参数来初始化每个元素对象的
mstlq 2010-02-01
  • 打赏
  • 举报
回复
这个叫做“一个顶两”……

class A
{
public:
A() : x(0), y(0){cout < <"缺省构造函数" < <endl;}
A(int a, int b) : x(a), y(b){cout < <"普通构造函数" < <endl;}

A(const A &other) : x(other.x), y(other.y){cout < <"拷贝构造函数" < <endl;}
private:
int x;
int y;
};


或者
class A 
{
public:
A(int a = 0, int b = 0) : x(a), y(b){cout < <"普通构造函数" < <endl;}

A(const A &other) : x(other.x), y(other.y){cout < <"拷贝构造函数" < <endl;}
private:
int x;
int y;
};

都可以

64,637

社区成员

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

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