c++中的关键字--static,this,virtual,volatile与operator

总结:static —局部全局变量
this—成员函数中使用指针
volatile—防止编译器优化

- Static

静态数据成员
1.静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中。 其定义方式与全局变量相同。
2.静态数据成员被 类 的所有对象所共享,包括该类派生类的对象。即派生类对象与基类对象共享基类的静态数据成员
3.静态数据成员可以成为成员函数的可选参数,而普通数据成员则不可以
4.静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为 所属类类型的 指针或引用。举例如下:

      class base{ 
            public : 
            static base _object1;//正确,静态数据成员 
            base _object2;//错误 
            base *pObject;//正确,指针 
            base &mObject;//正确,引用 
            }; 

静态成员函数
1. 静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用 类成员函数指针来储存。举例如下:
class base{
static int func1();
int func2();
};

int (*pf1)()=&base::func1;//普通的函数指针
int (base::*pf2)()=&base::func2;//成员函数指针
2. 静态成员函数不可以调用类的非静态成员。因为静态成员函数不含this指针。
3. 静态成员函数不可以同时声明为 virtual、const、volatile函数。

this指针

  1. this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。
  2. this只能在成员函数中使用。全局函数、静态函数都不能使用this.
    实际上,成员函数默认第一个参数为T * const this。
    如:
 class A
 {
  public:
     int func(int p)
     {
     }
 };

其中,func的原型在编译器看来应该是:
int func(A * const this,int p);
3. this在成员函数的开始前构造,在成员函数的结束后清除。

virtual

实现基类子类多态化,基于向上类型转换,基类通过虚函数可以对多个子类相似的功能实现多态实现管理。

volatile

作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.
简单地说就是防止编译器对代码进行优化.比如如下程序:
XBYTE[2]=0x55;
XBYTE[2]=0x56;
XBYTE[2]=0x57;
XBYTE[2]=0x58;
对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作

operator重载

实例:
1)用成员函数来重载运算符:

#include
using namespace std;
class X{
   int i;
public:
   X(int ii=0){i=ii;}
   X operator   +(const X &rx){
       i+=rx.i;
       return X(i);
   }
   int GetI(){return i;}
};
int main(){
   X a(1),b(3);
   cout<<(a+b).GetI()<
   return 0;
}

2) 用友元函数来重载运算符
说明:此时若用 #include
using namespace std;
则会出现如下的错误:
fatal error C1001: INTERNAL COMPILER ERROR
所以头文件用:#include

#include
using namespace std;
class Complex{
public:
   Complex(double r=0.0,double i=0.0){
       real=r;
       image=i;
   }
   friend Complex operator+(const Complex&,const Complex&);
   void display();
private:
   double real;
   double image;
};

Complex operator+(const Complex &c1,const Complex &c2){
   return Complex(c1.real+c2.real,c1.image+c2.image);
}

void Complex::display(){
   cout<<"("<
}

int main(){
   Complex c1(3,4),c2(5,-10),c3;
   c3=c1+c2;
   cout<<"c1=";c1.display();
   cout<<"c2=";c2.display();
   cout<<"c1+c2=";c3.display();
   return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值