1、C++程序到C程序的翻译
class CCar { struct CCar { public: int price; int price; }; void SetPrice(int p); void SetPrice(struct CCar * this,int p){ }; this->price = p; void CCar::SetPrice(int p){ } price = p; //this->price = p; } int main() { int main(){ struct CCar car; CCar car; SetPrice( & car,20000); car.SetPrice(20000); return 0; return 0; } }
2、this指针作用:非静态成员函数中可以直接使用this来代表指向该函数作用的对象的指针
3、this指针和静态成员函数:静态成员函数并不具体作用与某个对象,所以静态成员函数中不能使用 this 指针
二、静态成员
静态成员:在说明前面加了static关键字的成员。
普通成员变量每个对象有各自的一份,而静态成员变量一共就一份,为所有对象共享,sizeof 运算符不会计算静态成员变量。
class CRectangle{ private: int w, h; static int nTotalArea; // 静态成员变量 public: CRectangle(int w_,int h_); ~CRectangle(); static void PrintTotal(); // 静态成员函数 };
1、访问静态成员的方法:
类名::成员名 CRectangle::PrintTotal();
对象名.成员名 CRectangle r; r.PrintTotal();
指针->成员名 CRectangle * p = &r; p->PrintTotal();
引用.成员名 CRectangle & ref = r; int n = ref.nTotalNumber;
2、注意事项:
三、成员对象和封闭类
1、定义:有成员对象的类叫 封闭(enclosing)类
class CTyre{ // 轮胎类 private: int radius; // 半径 int width; // 宽度 public: CTyre(int r,int w):radius(r),width(w) { } }; class CEngine{ // 引擎类 }; class CCar { // 汽车类 private: int price; // 价格 CTyre tyre; CEngine engine; public: CCar(int p,int tr,int tw ); }; CCar::CCar(int p,int tr,int w):price(p),tyre(tr, w){}; int main(){ CCar car(20000,17,225); return 0; }
上例中,如果 CCar类不定义构造函数, 则下面的语句会编译出错:CCar car;因为编译器不明白 car.tyre该如何初始化。car.engine 的初始化没问题,用默认构造函数即可。任何生成封闭类对象的语句,都要让编译器明白,对象中的成员对象,是如何初始化的。具体的做法就是:通过封闭类的构造函数的初始化列表。
class CTyre { public: CTyre() { cout << CTyre contructor << endl; } ~CTyre() { cout << CTyre destructor << endl; } }; class CEngine { public: CEngine() { cout << CEngine contructor << endl; } ~CEngine() { cout << CEngine destructor << endl; } }; class CCar { private: CEngine engine; CTyre tyre; public: CCar( ) { cout << “CCar contructor” << endl; } ~CCar() { cout << CCar destructor << endl; } }; int main(){ CCar car; return 0; } //输出结果: CEngine contructor CTyre contructor CCar contructor CCar destructor CTyre destructor CEngine destructor
四、友元(friends)
class CCar ; //提前声明 CCar 类,以便后面的CDriver 类使用 class CDriver{ public: void ModifyCar( CCar * pCar) ; // 改装汽车 }; class CCar{ private: int price; friend int MostExpensiveCar( CCar cars[], int total); // 声明友元 friend void CDriver::ModifyCar(CCar * pCar); // 声明友元,可包括构造、析构函数 }; void CDriver::ModifyCar( CCar * pCar){ pCar->price += 1000; // 汽车改装后价值增加 } int MostExpensiveCar( CCar cars[],int total){ // 求最贵汽车的价格 int tmpMax = -1; for( int i = 0;i < total; ++i ) if( cars[i].price > tmpMax) tmpMax = cars[i].price; return tmpMax; }
(2)友元类 : 如果A 是B的友元类,那么A 的成员函数可以访问B的私有成员,友元类之间的关系不能传递,不能继承
class B{ friend class A; // 声明A为友元类 };
五、常量成员函数
1、作用:如果不希望某个对象的值被改变,则定义该对象的时候可以在前面加 const关键字
class Sample { private : int value; public: Sample() { } void SetValue() { } }; const Sample Obj; // 常量对象 Obj.SetValue (); //错误,常量对象只能使用构造函数、析构函数和有const说明的函数(常量方法)
2、常量成员函数的重载:两个函数,名字和参数表都一样,但是一个是const,一个不是,算重载
3、mutable成员变量:
(1)作用:mutable突破const的限制而设置,被mutable修饰的变量将永远处于可变的转态,即使在一个const函数中。
(2)应用:如果类的成员函数不会改变对象的状态,那么一般会声明成const。但是,有些时候,需要在const的函数里面修改一些跟类状态无关的数据成员,那么这些数据成员就应该被mutable来修饰。
class CTest{ public: bool GetData() const{ m_n1++; return m_b2; } private: mutable int m_n1; bool m_b2; };
相关推荐:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。