怎么给对象成员数组初始化呢?

时间:2022-09-10 09:27:10
比如我定了下面的类:
class a{
public:
int x;
};
class b{
public:
a a1[3];
b()://怎么在这个后对对象数组a1[3]初始化呢?
};
void main()
{……}

20 个解决方案

#1


其实,你如果给class a写一个默认的构造函数,那么,系统会自动给对象数组a1[3]初始化

#2


不是吧

假如非要在我指定的那个苇子呢?

#3


对,构造函数就是做这个用的

#4


假如非要在我指定的那个位子呢?

#5


怎么回事?
当你写
a al[3]的时候其实已经用a的默认的构造函数对每个元素初始化了
在b():这里再赋值就不是初始化了.

#6


假如我没有在A定义的不是默认的构造函数是有带参数的呢?

#7


http://expert.csdn.net/Expert/topic/2304/2304238.xml?temp=.2799494

封装一下就可以了:
struct ARR
{
int m[4];
};
class A{
public:
    A();
    const ARR arr;  //当然也可以是其它类型,也可以用vector
};
const ARR g_arr = {1,1,1,1};
A::A() : arr(g_arr)
{
}

#8


在第一各类里面加构造函数,在第二个类里面就可以自动初始化。

#9


wingfiring(别逗了) 说的根本就不行啊

#10


应该可以的,给A类写构造函数就行了,

#11


如果要定义类的对象数组的话,那么该类一定要有缺省的构造函数,否则编译时就会出现如下错误:
no appropriate default constructor available//没有合适的可利用的缺省构造函数

#12


class A
{
public:
A()
{
//value=100;
printf("Invoke A()\n");
}
A(int v){printf("Invoke A(int v)\n");}
};
class B
{
private:
A a[4];
public:
B(){printf("Invoke B()\n");}
};
void main()
 {
B b;
getchar();
}
输出:
Invoke A()
Invoke A()
Invoke A()
Invoke A()
Invoke B()
从输出可以看出,数组对象会自动调用缺省构造函数(或与缺省构造函数近似的构造函数,比如A(char ch='a')这种构造函数)进行初始化.
如果将A()这一构造函数的代码去掉的化,编译时就会出现如下信息:
no appropriate default constructor available

#13


如果不用构造函数呢?

#14


如果不用是不是就不行了 
wingfiring(别逗了) 说的根本就不行啊

#15


如果不用是不是就不行了 
wingfiring(别逗了) 说的根本就不行啊

#16


怎么不行?问题是你不能够再构造函数后面写初始化列表,而是要用一个对象去初始化。
对于你的代码应该这样:
#include <iostream>
using namespace std;
class a{
    public:
        int x;
};
struct ARR
{
     a ma[3];
};
ARR g_arr = { 1,2,3};
class b{
    public:
        ARR m;
        b():m(g_arr)
        {}
};
void main()
{
    b ba;
    cout << ba.m.ma[0].x <<endl;
    cout << ba.m.ma[1].x <<endl;
    cout << ba.m.ma[2].x <<endl;
}
编译命令行
cl /GX aa.cpp
aa.cpp是我的文件名。
我的是vc6.0

#17


我想说,在声明类的时候,是不能对数据成员进行初始化的。
你可以在类的成员函数的定义中初始化a,这个操作是由a的构造函数来完成的。

#18


错。
static 加上const 就必须在类中初始化。

#19


若a有多个构造函数,在b的构造函数中可以指明a[]数组的那个元素是用那个特定的构造函数
,如果没有指明的话,则用默认构造函数

#20


在语法上,是不可以通过初始化列表来给数组初始化的。
因为数组的初始化成员的含义是为一个集合罗列数据。
而对象初始化列表上意味着构造对象,这是不同的两个概念,因此,是不应该通过初始化列表来给数组成员初始化的。而数组并不是C++对象,也不能指望这种形式:
b():m[0](1),m[1](2),m[2](3),m[3](4).
所以,将数组封装成一个对象,也就是很自然的做法了。

#1


其实,你如果给class a写一个默认的构造函数,那么,系统会自动给对象数组a1[3]初始化

#2


不是吧

假如非要在我指定的那个苇子呢?

#3


对,构造函数就是做这个用的

#4


假如非要在我指定的那个位子呢?

#5


怎么回事?
当你写
a al[3]的时候其实已经用a的默认的构造函数对每个元素初始化了
在b():这里再赋值就不是初始化了.

#6


假如我没有在A定义的不是默认的构造函数是有带参数的呢?

#7


http://expert.csdn.net/Expert/topic/2304/2304238.xml?temp=.2799494

封装一下就可以了:
struct ARR
{
int m[4];
};
class A{
public:
    A();
    const ARR arr;  //当然也可以是其它类型,也可以用vector
};
const ARR g_arr = {1,1,1,1};
A::A() : arr(g_arr)
{
}

#8


在第一各类里面加构造函数,在第二个类里面就可以自动初始化。

#9


wingfiring(别逗了) 说的根本就不行啊

#10


应该可以的,给A类写构造函数就行了,

#11


如果要定义类的对象数组的话,那么该类一定要有缺省的构造函数,否则编译时就会出现如下错误:
no appropriate default constructor available//没有合适的可利用的缺省构造函数

#12


class A
{
public:
A()
{
//value=100;
printf("Invoke A()\n");
}
A(int v){printf("Invoke A(int v)\n");}
};
class B
{
private:
A a[4];
public:
B(){printf("Invoke B()\n");}
};
void main()
 {
B b;
getchar();
}
输出:
Invoke A()
Invoke A()
Invoke A()
Invoke A()
Invoke B()
从输出可以看出,数组对象会自动调用缺省构造函数(或与缺省构造函数近似的构造函数,比如A(char ch='a')这种构造函数)进行初始化.
如果将A()这一构造函数的代码去掉的化,编译时就会出现如下信息:
no appropriate default constructor available

#13


如果不用构造函数呢?

#14


如果不用是不是就不行了 
wingfiring(别逗了) 说的根本就不行啊

#15


如果不用是不是就不行了 
wingfiring(别逗了) 说的根本就不行啊

#16


怎么不行?问题是你不能够再构造函数后面写初始化列表,而是要用一个对象去初始化。
对于你的代码应该这样:
#include <iostream>
using namespace std;
class a{
    public:
        int x;
};
struct ARR
{
     a ma[3];
};
ARR g_arr = { 1,2,3};
class b{
    public:
        ARR m;
        b():m(g_arr)
        {}
};
void main()
{
    b ba;
    cout << ba.m.ma[0].x <<endl;
    cout << ba.m.ma[1].x <<endl;
    cout << ba.m.ma[2].x <<endl;
}
编译命令行
cl /GX aa.cpp
aa.cpp是我的文件名。
我的是vc6.0

#17


我想说,在声明类的时候,是不能对数据成员进行初始化的。
你可以在类的成员函数的定义中初始化a,这个操作是由a的构造函数来完成的。

#18


错。
static 加上const 就必须在类中初始化。

#19


若a有多个构造函数,在b的构造函数中可以指明a[]数组的那个元素是用那个特定的构造函数
,如果没有指明的话,则用默认构造函数

#20


在语法上,是不可以通过初始化列表来给数组初始化的。
因为数组的初始化成员的含义是为一个集合罗列数据。
而对象初始化列表上意味着构造对象,这是不同的两个概念,因此,是不应该通过初始化列表来给数组成员初始化的。而数组并不是C++对象,也不能指望这种形式:
b():m[0](1),m[1](2),m[2](3),m[3](4).
所以,将数组封装成一个对象,也就是很自然的做法了。

#21