使用c++ 用初始化列表初始化类的string 初始化数据成员,然后报错,求解。江湖

C++类静态成员的初始化和用法探讨
一、一般类型的类的静态变量
1.首先看下面的代码:
class CTest1
static int m_num1;
void printNum(){cout && m_num2 &&};
void SetNum2(int i){m_num2 =};
static void printNum2(){cout && m_num2 &&};
static void printNum3(){cout && m_num3 &&};
static int m_num2;
protected:
static int m_num3;
int CTest1::m_num1 =1;
int CTest1::m_num2 =2;
int CTest1::m_num3 =3;
int main()
cout && CTest1::m_num1 &&
//cout && CTest1::m_num2 &&//这样编译报错
//cout && CTest1::m_num3 &&//这样编译报错
CTest1::printNum2();//通过静态函数打印
CTest1::printNum3();//通过静态函数打印
CTest1 t1;
t1.printNum();
CTest1 t2;
t2.printNum();
t1.SetNum2(20);
t1.printNum();
t2.printNum();
t2.SetNum2(30);
t1.printNum();
t2.printNum();
CTest1::m_num1 = 10;
& & return 0; &
2.测试结果:
1).public类型的类的静态变量,可以在类外面进行初始化,也可以在别的函数里通过&类名::变量&(比如:CTest1::m_num1)进行访问和操作。
2).private、protected,可以在类外面进行初始化,不能通过&类名::变量&访问和操作,可以定义public类型的静态函数,通过&类名::函数&进行访问和操作;也可以通过定义类的对象,通过对象调用函数来访问和操作。
3).类的静态变量,在一个对象(或者类外)改变和操作后,其他所有的地方都会相应改变,比如t1和t2的操作。
这个特点可以用来计算一个类的对象被使用了多少次,变量初始化为0,比如new的时候变量++,delete的时候变量--,当变量为=0时候,可以销毁这个类的对象。
二、const类型的类的静态变量
1.首先看下面的代码:
class CTest2
CTest2(int i, char* str)
static const int m_num1;//static const int m_num1 =16;//VC中这样不行
static const char* m_//static const char m_name[m_num1];//VC中这样不行
const int CTest2::m_num1 =1;
const char* CTest2::m_name=&121212&;
int main()
cout && CTest2::m_num1 &&
//CTest2::m_num1 =10;//这样会编译报错。
public类型的类的const类型的静态变量,可以在类外面进行初始化,也可以在别的函数里通过&类名::变量&(比如:CTest1::m_num1)进行访问,但不能被改变,这个是const的特性。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'C++问题求解,在类中为什么不能给数据成员初始化值:_百度知道
C++问题求解,在类中为什么不能给数据成员初始化值:
因为类只是定义的类型,
还没有实例化,也就是没有定义类的对象(变量), 没法存储你可以在初始化列表里进行初始化 ,
而构造函数的函数体之内赋值的话, 是在初始化后,-------------至于定义成static的, 这是静态的, 所有对象共享一个副本, 程序开始执行就初始化了, 就算没有定义对象, 也有它的实例, 能直接使用 A::static_a =
其他类似问题
为您推荐:
因为类不能分配内存空间,只能声明有哪些变量,初始化要在构造函数中完成
类中给成员初始化必须用初始化列表class A{public:A ():a(10){} };
不太明白,你为什么要在public后面加冒号。
问题求解的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁C++初始化函数列表详细解析
字体:[ ] 类型:转载 时间:
C++可以定义引用类型的成员变量,引用类型的成员变量必须在构造函数的初始化列表中进行初始化
在以下三种情况下需要使用初始化成员列表:
一,需要初始化的数据成员是对象的情况;
二,需要初始化const修饰的类成员;
三,需要初始化引用成员数据;
原因:C++可以定义引用类型的成员变量,引用类型的成员变量必须在构造函数的初始化列表中进行初始化。对于类成员是const修饰,或是引用类型的情况,是不允许赋值操作的,(显然嘛,const就是防止被错误赋值的,引用类型必须定义赋值在一起),因此只能用初始化列表对齐进行初始化。成员类型是没有默认构造函数的类。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。(也就是这三种情况必须使用初始化列表)
我们定义一个如下的Person类: 代码如下:class Person {
  Person() { } //default constructor function
  Person(string name, string phone, string addr)
    m_name = //想采用赋值初始化数据成员
    m_phone =
    m_addr =
  const string m_
  const string m_
  const string m_
};编译后发现这个类的第二个带参数的构造函数是错误的。我们创建一个Person对象:
Person p("marcky", "", "cqupt"); //调用带参数的构造函数创建一个Person对象 创建对象的过程分为了两步:
一、从内存中分配实际的空间给对象p,其三个字符串对象的数据成员是调用的默认构造函数初始化为空。也就说,此时为止,对象p的三个数据成员都是一个空的字符串。
二、执行调用的构造函数的函数体语句,完成对数据成员的赋值,以此达到我们期望的创建一个指定Person对象,而不是空对象。
从上面的第二步就可以看到,我们在对三个const对象进行赋值操作,这显然是不允许的操作,因此利用这个构造函数创建Person将以失败告终。要想成功的创建一个特定的Person对象,我们需要构造函数初始化列表:
Person(string name, string phone, string addr):m_name(name), m_phone(phone), m_addr(addr){ } //冒号开始定义初始化列表 使用初始化列表创建对象的构造函数同样是通过上述的两个步骤来完成的,不同之处在于创建对象的数据成员时使用的不是默认构造函数,而是根据指定参数调用了相应的构造函数,以此创建特定的对象,而不是空对象。这样一来,对象的数据成员的特定值在创建对象的时候就被赋予了相应的成员,而不是在创建对象完成之后再通过赋值语句去修改数据成员,因此利用构造函数初始化列表就可以成功的创建具有const数据成员的对对象了。
没有默认构造函数的类类型成员,如果不在初始化列表中初始化的话,那么创建该对象的时候,由于没有指定相应的“实参”,编译器就会去调用默认构造函数来创建对象,必然会以失败而告终。
注1:数据成员被初始化的顺序与构造函数初始化列表中的次序无关,而是与成员的定义顺序一致。
注2:使用初始化列表效率更高,如果在构造函数中赋值则是拷贝,如果是初始化列表中则是初始化,赋值和初始化当然效率不一样了。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具C++类数组成员初始化问题_百度知道
C++类数组成员初始化问题
又可以了,CRect()},然后在源文件中的构造函数中去初始化它m_rect = {CRect();这样写竟然报错但是源文件中改为CRect m_rect[4] =
{CRect(),CRect(),CRect(),CRect(),CRect()},CRect()在类头文件中我声明了一个CRect数组Crect m_rect[4]
提问者采纳
在声明的时候可以这样写, 1, 2; 这句是在给数组初始化, 1,CRect()}; ,CRect()。所以会有编译错误。但数组是没有赋值操作的。在声明之后编译器会认为你是在给数组赋值, 2。CRect m_rect[4] =
{CRect(),是初始化; 这个是没有问题的m_rect = {CRect(),这个就过不了了,比如你定义一个 int a[4] = { 0,CRect()。简单点儿,CRect(), 3 },但在声明之后你再写 a = { 0,CRect()}, 3 }; 这句是在给数组赋值,CRect()。一个意思
明白了,但是怎么给我这个数组初始化啊?
可以用 m_Rect[0] = CRect(); 初始化第一个数组元素,剩下的类推。
提问者评价
其他类似问题
为您推荐:
其他3条回答
CRect()。所以:CRect m_rect[4] =
{CRect()数组初始化是指在定义数组时为数组元素提供值; ——是对的而Crect m_rect[4],CRect()},CRect();m_rect = {CRect(),CRect(),CRect()},CRect();——是错误的
m_rect = {CRect(),CRect(),CRect(),CRect()};数组名怎么能=后面那么多。。。不是迫不得已不要用全局变量,即使用也别写在头文件中。写在源文件中,在使用的地方声明extern 即可。
看错了。。。 把完整程序贴上来吧
初始化的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 list string 初始化 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信