类初始化问题!

时间:2021-12-05 17:28:11
我想在类定义初始化类里的某个int对象值

class abc{
public:
int a;
};
abc::ok=4;//为什么这里初始化值出现错误?提示:

d:\my_test\ha\head.h(14) : error C2501: 'ok' : missing storage-class or type specifiers
d:\my_test\ha\head.h(14) : error C2350: 'abc::ok' is not a static member

为什么把abc::ok=4;改成int abc::ok=4;也出错:

d:\my_test\ha\head.h(14) : error C2350: 'abc::ok' is not a static member


怎么做才不会出错?我是VC++6.0

15 个解决方案

#1


class abc{
public:
int a;
static int ok;
};
abc::ok=4;//

#2


楼上的,那int a;不初始化就有错误啊,另外为什么一定要加static才能那样初始化?是不是所有非static的对象都得在构造函数里初始化?

#3


楼上的,那int a;不初始化就有错误啊,另外为什么一定要加static才能那样初始化?是不是所有非static的对象都得在构造函数里初始化?


我改成
static int ok;
以后再
abc::ok=5;
提示我说
d:\my_test\ha\head.h(14) : error C2501: 'ok' : missing storage-class or type specifiers

加上int也就是改成int abc::ok=5;才不会有错,这是为什么?

#4


本来就是要加的

#5


静态变量在类中说明所有的类对象的这个变量占有同一个存储单元。在类中的静态变量只是一个声明并没有定义。所以必须在类外给它定义。它可以用类名访问。例如:
class abc{
public:
int a;
static int ok;  //声明
};
int abc::ok=4;   //定义
非静态变量类所定义的不同实例有不同的存储单元,所以它必须用类的实例来访问。
  

#6


为什么我类里的非static的对象都不能在类定义里初始化?
是不是所有非static的对象都只能在构造函数里初始化?

我这样给非static定义值出错了。 

class abc{
public:
int a;
};
abc::ok=4;//为什么这里初始化值出现错误?提示:

d:\my_test\ha\head.h(14) : error C2501: 'ok' : missing storage-class or type specifiers
d:\my_test\ha\head.h(14) : error C2350: 'abc::ok' is not a static member

#7


“为什么我类里的非static的对象都不能在类定义里初始化?
是不是所有非static的对象都只能在构造函数里初始化?”

因为类只是声明了一个类型。并没有分配存储空间,所以不能初始化。

abc::ok=4;//为什么这里初始化值出现错误?提示:

这个问题我上面已经说过了,你看看上面的贴仔细想想就知道了。

#8


为什么我类里的非static的对象都不能在类定义里初始化?

类是类,对象是对象,原则上,任何对象(或许说是变量更合适些.)都不能在类里面初始化.
但有一些例外,就是类的某些成分,它可能被类的所有对象共享.比如一个汽车类,某类汽车的发动机可能全部是一个牌子的.所以就可以把它设为静态常量,然后按上面的格式初始化,初始化的时候,要以完全的格式写出来.(你可以理解为它不是类的成员,不过仅仅是个在类中"注册"了变量,表示此类的对象可以使用它.)这里又有一个例外,那就是对于整型(字符也算是)的静态变量,你可以在类中初始化.

是不是所有非static的对象都只能在构造函数里初始化?
可以这样说,
有一个要注意的地方,就是在构造函数里的初始化也可以以初始化表的形式出现.
如:
class A;
class B;
class C
{
public:
     C(const A& a,const B& b):m_A_(a),m_B_(b){}//注意这里的写法.
private:
     A m_A_;
     B m_B_;
};

为什么要有初始化表???而不是普通的构造函数(即你所理解的"只能在构造函数里初始化"的构造函数?)
原因,对于成员类型为系统内置类型的初始化,两种写法没什么区别.
但是,对于用户定义类型,如此例,则强烈建议用初始化表的方法.
(关于此议,自己找点资料看吧.我就不再讲了.)

#9


楼上的:
这里又有一个例外,那就是对于整型(字符也算是)的静态变量,你可以在类中初始化.
是什么意思?
是不是说这样是合法的,不过编译时说出错(在vc++6.0中)
#include <iostream.h>
class A{
public:
int a=3;
int b=4;
char c='w';
};
void main()
{
cout<<A.a<<endl;
cout<<A.b<<endl;
cout<<A.c<<endl;
}

#10


bluejugar(我爱小艳) 
说的很详细,多谢,受益非浅,这样写是不是也正确?

class A;
class B;
class C
{
public:
     C(const A& a,const B& b);
private:
     A m_A_;
     B m_B_;
};
c::c(const A& a,const B& b):m_A(a),m_B(b){}

#11


构造函数就是用来初始化的,初始化就是要用构造函数的,(静态数据除外)这是好基本的东西啊,楼主应该复习一下c++的语法了。

#12


class A{};
class B{};
class C
{
public:
     C(const A& a,const B& b);
private:
     A m_A_;
     B m_B_;
};
C::C(const A& a,const B& b):m_A_(a),m_B_(b){}

这样可以!

#13


我爱小艳:
可不可以给个例子说明一下你说的:
这里又有一个例外,那就是对于整型(字符也算是)的静态变量,你可以在“类中”初始化.
是什么意思呀。

#14


class A;
class B;
class C
{
public:
     C(const A& a,const B& b):m_A_(a),m_B_(b){}//注意这里的写法.
private:
     A m_A_;
     B m_B_;
     static const int nAtheon = 2004;
     const static int nPeking = 2008;
};
静态常量整型可以在类中初始化.

#15


"c::c(const A& a,const B& b):m_A(a),m_B(b){}"
这样写是正确的.

#1


class abc{
public:
int a;
static int ok;
};
abc::ok=4;//

#2


楼上的,那int a;不初始化就有错误啊,另外为什么一定要加static才能那样初始化?是不是所有非static的对象都得在构造函数里初始化?

#3


楼上的,那int a;不初始化就有错误啊,另外为什么一定要加static才能那样初始化?是不是所有非static的对象都得在构造函数里初始化?


我改成
static int ok;
以后再
abc::ok=5;
提示我说
d:\my_test\ha\head.h(14) : error C2501: 'ok' : missing storage-class or type specifiers

加上int也就是改成int abc::ok=5;才不会有错,这是为什么?

#4


本来就是要加的

#5


静态变量在类中说明所有的类对象的这个变量占有同一个存储单元。在类中的静态变量只是一个声明并没有定义。所以必须在类外给它定义。它可以用类名访问。例如:
class abc{
public:
int a;
static int ok;  //声明
};
int abc::ok=4;   //定义
非静态变量类所定义的不同实例有不同的存储单元,所以它必须用类的实例来访问。
  

#6


为什么我类里的非static的对象都不能在类定义里初始化?
是不是所有非static的对象都只能在构造函数里初始化?

我这样给非static定义值出错了。 

class abc{
public:
int a;
};
abc::ok=4;//为什么这里初始化值出现错误?提示:

d:\my_test\ha\head.h(14) : error C2501: 'ok' : missing storage-class or type specifiers
d:\my_test\ha\head.h(14) : error C2350: 'abc::ok' is not a static member

#7


“为什么我类里的非static的对象都不能在类定义里初始化?
是不是所有非static的对象都只能在构造函数里初始化?”

因为类只是声明了一个类型。并没有分配存储空间,所以不能初始化。

abc::ok=4;//为什么这里初始化值出现错误?提示:

这个问题我上面已经说过了,你看看上面的贴仔细想想就知道了。

#8


为什么我类里的非static的对象都不能在类定义里初始化?

类是类,对象是对象,原则上,任何对象(或许说是变量更合适些.)都不能在类里面初始化.
但有一些例外,就是类的某些成分,它可能被类的所有对象共享.比如一个汽车类,某类汽车的发动机可能全部是一个牌子的.所以就可以把它设为静态常量,然后按上面的格式初始化,初始化的时候,要以完全的格式写出来.(你可以理解为它不是类的成员,不过仅仅是个在类中"注册"了变量,表示此类的对象可以使用它.)这里又有一个例外,那就是对于整型(字符也算是)的静态变量,你可以在类中初始化.

是不是所有非static的对象都只能在构造函数里初始化?
可以这样说,
有一个要注意的地方,就是在构造函数里的初始化也可以以初始化表的形式出现.
如:
class A;
class B;
class C
{
public:
     C(const A& a,const B& b):m_A_(a),m_B_(b){}//注意这里的写法.
private:
     A m_A_;
     B m_B_;
};

为什么要有初始化表???而不是普通的构造函数(即你所理解的"只能在构造函数里初始化"的构造函数?)
原因,对于成员类型为系统内置类型的初始化,两种写法没什么区别.
但是,对于用户定义类型,如此例,则强烈建议用初始化表的方法.
(关于此议,自己找点资料看吧.我就不再讲了.)

#9


楼上的:
这里又有一个例外,那就是对于整型(字符也算是)的静态变量,你可以在类中初始化.
是什么意思?
是不是说这样是合法的,不过编译时说出错(在vc++6.0中)
#include <iostream.h>
class A{
public:
int a=3;
int b=4;
char c='w';
};
void main()
{
cout<<A.a<<endl;
cout<<A.b<<endl;
cout<<A.c<<endl;
}

#10


bluejugar(我爱小艳) 
说的很详细,多谢,受益非浅,这样写是不是也正确?

class A;
class B;
class C
{
public:
     C(const A& a,const B& b);
private:
     A m_A_;
     B m_B_;
};
c::c(const A& a,const B& b):m_A(a),m_B(b){}

#11


构造函数就是用来初始化的,初始化就是要用构造函数的,(静态数据除外)这是好基本的东西啊,楼主应该复习一下c++的语法了。

#12


class A{};
class B{};
class C
{
public:
     C(const A& a,const B& b);
private:
     A m_A_;
     B m_B_;
};
C::C(const A& a,const B& b):m_A_(a),m_B_(b){}

这样可以!

#13


我爱小艳:
可不可以给个例子说明一下你说的:
这里又有一个例外,那就是对于整型(字符也算是)的静态变量,你可以在“类中”初始化.
是什么意思呀。

#14


class A;
class B;
class C
{
public:
     C(const A& a,const B& b):m_A_(a),m_B_(b){}//注意这里的写法.
private:
     A m_A_;
     B m_B_;
     static const int nAtheon = 2004;
     const static int nPeking = 2008;
};
静态常量整型可以在类中初始化.

#15


"c::c(const A& a,const B& b):m_A(a),m_B(b){}"
这样写是正确的.