C++中的static静态类 与::代表什么意思
2017-11-30 16:47
309 查看
开始之前先说一下在C++中::是代表什么意思表示作用域,和所属关系
比如
class A
{
public:
int test();
}
int A::test()//表示test是属于A的
{
return 0;
}
类似的还有其他,就不列举了
--------------------
比如
int a;
void test ()
{
int a = ::a;//用全局变量a,给本地变量a赋值
}
静态类成员,可以使用类名直接访问。静态类成员在类类成员定义前使用static关键字标识 。而普通类成员,都是通过new类后的的对象来访问的,不能通过类名直接访问
class CBook{
public :
static unsigned int m_Price;//定义一个静态数据成员
}
在定义静态数据成员时,通常需要在类体外部对静态数据成员进行初始化。例如:
unsigned int CBook :: m_Price = 10;//初始化静态数据成员
对于静态成员来说,不仅可以通过对象访问,还可以直接使用类名访问。例如:
int main(int args ,char* argv[]){
CBook book; //定义一个CBook类对象book
cout<<,CBook::m_Price <<endl; //通过类名访问静态成员
cout<< book.m_Price<<endl; //通过对象访问静态成员
return 0 ;
}在一个类中,静态数据成员是被所有的类对象所共享的,这就是意味着无论定义多少个类对象,类的静态数据成员只有一份,同时,如果某一个对象修改了静态数据成员,其他对象的静态数据成员(实际上是同一个静态数据成员)也将改变。
对于静态数据成员,还需要注意以下几点:
1)静态数据成员可以是当前类的类型,而其他数据成员只能是当前类的指针或应用类型。
在定义类成员时,对于静态数据成员,其类型可以是当前类的类型,而非静态数据成员则不可以,除非数据成员的类型为当前类的指针或引用类型。例如:
Class CBook{
public :
static unsigned int m_Price;
CBook m_Book; //非法的定义,不允许在该类中定义所属类的对象
static CBook m_VCbook; //正确,静态数据成员允许定义类的所属类对象
CBook *m_pBook; //正确,允许定义类的所属类型的指针类型对象
}
2)静态数据成员可以作为成员函数的默认参数
在定义类的成员函数时,可以为成员函数指定默认参数,其参数的默认值也可以是类的静态数据成员,但是不同的数据成员则不能作为成员函数的默认参数。例如:
class CBook{
public :
static unsigned int m_Price;//定义一个静态数据成员;
int m_Pages; //定义一个普通数据成员;
void OutputInfo(int data = m_price){//定义一个函数,以静态数据成员作为默认参数
cout<<data<< endl;
}
void OutputPage(int page = m_Pages
{//错误的定义,类的普通数据成员不能作为默认参数
cout<<page<< endl;
}
}
下面介绍类的静态成员函数。定义类的静态成员函数与定义普通的成员函数类似,只是在成员函数钱添加static关键字。例如:
static void OutputInfo(); //定义类的静态成员函数类的静态成员函数只能访问类的静态数据成员,而不能访问普通的数据成员。例如:
class CBook{
public :
static unsigned int m_Price;//定义一个静态数据成员
int m_Pages; //定义一个普通数据成员
static void OutputInfo(){
cout<<m_Price<<endl; //正确的访问
cout<<m_Pages<<endl; //非法的访问,不能访问非静态数据成员
}
} 在上述代码中,cout<<m_Pages<<endl;是错误的,因为m_Pages是非静态数据成员,不能在静态成员函数中访问
此外,对于静态成员函数不能定义为const成员函数,即静态成员函数末尾不能使用const关键字。例如,下面的静态成员函数的定义是非法的
static void OutputInfo()const; //错误的定义,静态成员函数末尾不能使用const关键字 在定义静态数据成员函数时,如果函数的实现代码处于类体之外,则在函数的实现部分不能再标识static关键字。例如:,下面的函数定义是非法的。
static void CBook::OutputInfo()//错误的函数定义,不能使用static关键字
{
cout <<m_Price <<endl;
} 上述代码如果去掉static关键字则是正确的。例如:
void CBook :: OutputInfo() //正确的函数定义
{
cout<<m_Price <<endl;
}
比如
class A
{
public:
int test();
}
int A::test()//表示test是属于A的
{
return 0;
}
类似的还有其他,就不列举了
--------------------
比如
int a;
void test ()
{
int a = ::a;//用全局变量a,给本地变量a赋值
}
::是运算符中等级最高的,它分为三种: 1)global scope(全局作用域符),用法(::name) 2)class scope(类作用域符),用法(class::name) 3)namespace scope(命名空间作用域符),用法(namespace::name) 他们都是左关联(left-associativity) 他们的作用都是为了更明确的调用你想要的变量,如在程序中的某一处你想调用全局变量a,那么就写成::a,如果想调用class A中的成员变量a,那么就写成A::a,另外一个如果想调用namespace std中的cout成员,你就写成std::cout(相当于using namespace std;cout)意思是在这里我想用cout对象是命名空间std中的cout(即就是标准库里边的cout) 他们算是C++中的基础,如果运用的好的话,你程序的出错率也许会降很多,
静态类成员,可以使用类名直接访问。静态类成员在类类成员定义前使用static关键字标识 。而普通类成员,都是通过new类后的的对象来访问的,不能通过类名直接访问
class CBook{
public :
static unsigned int m_Price;//定义一个静态数据成员
}
在定义静态数据成员时,通常需要在类体外部对静态数据成员进行初始化。例如:
unsigned int CBook :: m_Price = 10;//初始化静态数据成员
对于静态成员来说,不仅可以通过对象访问,还可以直接使用类名访问。例如:
int main(int args ,char* argv[]){
CBook book; //定义一个CBook类对象book
cout<<,CBook::m_Price <<endl; //通过类名访问静态成员
cout<< book.m_Price<<endl; //通过对象访问静态成员
return 0 ;
}在一个类中,静态数据成员是被所有的类对象所共享的,这就是意味着无论定义多少个类对象,类的静态数据成员只有一份,同时,如果某一个对象修改了静态数据成员,其他对象的静态数据成员(实际上是同一个静态数据成员)也将改变。
对于静态数据成员,还需要注意以下几点:
1)静态数据成员可以是当前类的类型,而其他数据成员只能是当前类的指针或应用类型。
在定义类成员时,对于静态数据成员,其类型可以是当前类的类型,而非静态数据成员则不可以,除非数据成员的类型为当前类的指针或引用类型。例如:
Class CBook{
public :
static unsigned int m_Price;
CBook m_Book; //非法的定义,不允许在该类中定义所属类的对象
static CBook m_VCbook; //正确,静态数据成员允许定义类的所属类对象
CBook *m_pBook; //正确,允许定义类的所属类型的指针类型对象
}
2)静态数据成员可以作为成员函数的默认参数
在定义类的成员函数时,可以为成员函数指定默认参数,其参数的默认值也可以是类的静态数据成员,但是不同的数据成员则不能作为成员函数的默认参数。例如:
class CBook{
public :
static unsigned int m_Price;//定义一个静态数据成员;
int m_Pages; //定义一个普通数据成员;
void OutputInfo(int data = m_price){//定义一个函数,以静态数据成员作为默认参数
cout<<data<< endl;
}
void OutputPage(int page = m_Pages
{//错误的定义,类的普通数据成员不能作为默认参数
cout<<page<< endl;
}
}
下面介绍类的静态成员函数。定义类的静态成员函数与定义普通的成员函数类似,只是在成员函数钱添加static关键字。例如:
static void OutputInfo(); //定义类的静态成员函数类的静态成员函数只能访问类的静态数据成员,而不能访问普通的数据成员。例如:
class CBook{
public :
static unsigned int m_Price;//定义一个静态数据成员
int m_Pages; //定义一个普通数据成员
static void OutputInfo(){
cout<<m_Price<<endl; //正确的访问
cout<<m_Pages<<endl; //非法的访问,不能访问非静态数据成员
}
} 在上述代码中,cout<<m_Pages<<endl;是错误的,因为m_Pages是非静态数据成员,不能在静态成员函数中访问
此外,对于静态成员函数不能定义为const成员函数,即静态成员函数末尾不能使用const关键字。例如,下面的静态成员函数的定义是非法的
static void OutputInfo()const; //错误的定义,静态成员函数末尾不能使用const关键字 在定义静态数据成员函数时,如果函数的实现代码处于类体之外,则在函数的实现部分不能再标识static关键字。例如:,下面的函数定义是非法的。
static void CBook::OutputInfo()//错误的函数定义,不能使用static关键字
{
cout <<m_Price <<endl;
} 上述代码如果去掉static关键字则是正确的。例如:
void CBook :: OutputInfo() //正确的函数定义
{
cout<<m_Price <<endl;
}
相关文章推荐
- C++学习笔记——C++中四个点代表什么意思?
- C++语句:vector<string>v_string;是什么意思?v_string代表什么?
- 逻辑与 按位与 逻辑或 按位或 逻辑非 按位非是什么意思?c++
- 请帮忙解答,十分谢谢。下面的C++代码的宏定义是什么意思?
- C/C++语言里的near和far是什么意思?
- 软件版本具体代表什么意思
- IIS日志代码分析,常见的200,404,301,302分别代表什么意思
- C/C++中CRT表示什么意思?
- SVNsvn文件里有问号,打勾,感叹号,蓝色的十字符号,这些符号分别代表什么意思?SVN里面的AD
- CSS selector:div.title p代表的是什么意思(通俗易懂)
- c/c++目标文件中_ZN****符号是什么意思
- Linux部分命令解释(命令缩写代表什么意思)
- ::在C++中是什么意思
- Excel错误分别代表什么意思
- 帮我看看这个是什么意思 c++代码
- GetLastError返回值的代表什么意思!
- 在makefile文件中,@$符号代表什么意思?
- ::在C++中是什么意思
- VC中stdafx.h中afx代表什么意思
- C++函数声明的时候后面加const代表什么