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():这里再赋值就不是初始化了.
当你写
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)
{
}
封装一下就可以了:
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//没有合适的可利用的缺省构造函数
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
{
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(别逗了) 说的根本就不行啊
wingfiring(别逗了) 说的根本就不行啊
#15
如果不用是不是就不行了
wingfiring(别逗了) 说的根本就不行啊
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
对于你的代码应该这样:
#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的构造函数来完成的。
你可以在类的成员函数的定义中初始化a,这个操作是由a的构造函数来完成的。
#18
错。
static 加上const 就必须在类中初始化。
static 加上const 就必须在类中初始化。
#19
若a有多个构造函数,在b的构造函数中可以指明a[]数组的那个元素是用那个特定的构造函数
,如果没有指明的话,则用默认构造函数
,如果没有指明的话,则用默认构造函数
#20
在语法上,是不可以通过初始化列表来给数组初始化的。
因为数组的初始化成员的含义是为一个集合罗列数据。
而对象初始化列表上意味着构造对象,这是不同的两个概念,因此,是不应该通过初始化列表来给数组成员初始化的。而数组并不是C++对象,也不能指望这种形式:
b():m[0](1),m[1](2),m[2](3),m[3](4).
所以,将数组封装成一个对象,也就是很自然的做法了。
因为数组的初始化成员的含义是为一个集合罗列数据。
而对象初始化列表上意味着构造对象,这是不同的两个概念,因此,是不应该通过初始化列表来给数组成员初始化的。而数组并不是C++对象,也不能指望这种形式:
b():m[0](1),m[1](2),m[2](3),m[3](4).
所以,将数组封装成一个对象,也就是很自然的做法了。
#21
#1
其实,你如果给class a写一个默认的构造函数,那么,系统会自动给对象数组a1[3]初始化
#2
不是吧
假如非要在我指定的那个苇子呢?
假如非要在我指定的那个苇子呢?
#3
对,构造函数就是做这个用的
#4
假如非要在我指定的那个位子呢?
#5
怎么回事?
当你写
a al[3]的时候其实已经用a的默认的构造函数对每个元素初始化了
在b():这里再赋值就不是初始化了.
当你写
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)
{
}
封装一下就可以了:
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//没有合适的可利用的缺省构造函数
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
{
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(别逗了) 说的根本就不行啊
wingfiring(别逗了) 说的根本就不行啊
#15
如果不用是不是就不行了
wingfiring(别逗了) 说的根本就不行啊
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
对于你的代码应该这样:
#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的构造函数来完成的。
你可以在类的成员函数的定义中初始化a,这个操作是由a的构造函数来完成的。
#18
错。
static 加上const 就必须在类中初始化。
static 加上const 就必须在类中初始化。
#19
若a有多个构造函数,在b的构造函数中可以指明a[]数组的那个元素是用那个特定的构造函数
,如果没有指明的话,则用默认构造函数
,如果没有指明的话,则用默认构造函数
#20
在语法上,是不可以通过初始化列表来给数组初始化的。
因为数组的初始化成员的含义是为一个集合罗列数据。
而对象初始化列表上意味着构造对象,这是不同的两个概念,因此,是不应该通过初始化列表来给数组成员初始化的。而数组并不是C++对象,也不能指望这种形式:
b():m[0](1),m[1](2),m[2](3),m[3](4).
所以,将数组封装成一个对象,也就是很自然的做法了。
因为数组的初始化成员的含义是为一个集合罗列数据。
而对象初始化列表上意味着构造对象,这是不同的两个概念,因此,是不应该通过初始化列表来给数组成员初始化的。而数组并不是C++对象,也不能指望这种形式:
b():m[0](1),m[1](2),m[2](3),m[3](4).
所以,将数组封装成一个对象,也就是很自然的做法了。