正在悠闲地加载

C++学习笔记

 

构造函数: 

  构造函数里的参数不应该和成员属性名一样,否则编译可以通过,结果大吃一惊。构造函数可以直接写在类里面,也可以另外通过域操作符写在类外面。C++里面,如果你构造函数一个没写,编译器默认给你准备了一个。一旦你写了构造函数,编译器就不给你准备了。这个和Java似乎不太一样。反正,正常人都会写不止一个的构造函数吧。自己好好写是没有错的。

 

函数的重载:

  重载函数的参数个数、参数类型或参数顺序3者中必须至少有一种不同,函数返回值类型可以相同也可以不同。
  函数的重载一定发生在相同范围,一定是同一个类。
  virtual关键字可有可无。operator 运算符重载不影响优先级。不是所有的运算符都能被重载,以下运算符不能被重载:
  :: 作用域解析运算符
  ? : 条件运算符
  .  直接成员运算符
  .* 解除类指针引用运算符
  sizeof
 
     类成员函数的运算符重载,单目运算符 列表没有参数,双目运算符有一个参数,this指针看作一个对象。
   友元函数可以访问的类的私有成员和保护成员。使用友元函数可以提高性能,如用友元函数重载操作符生成迭代器类。
   用友元函数可以访问两个或多个类的私有数据,使人们更容易理解程序的逻辑关系。
 使用友元函数前应注意:
   类的友元函数在类作用域之外定义,但可以访问类的私有和保护成员
   尽管类定义中有友元函数原型,友元函数仍然不是成员函数
   由于友元函数不是任何类的成员函数,所以不能用句柄(对象)加点操作符来调用
   public, private, protected成员访问符与友员关系的声明无关,因此友元关系声明可在类定义的任何位置,习惯上在类定义的开始位置
 
析构函数:
  完成对象被删除前的一些清理工作。
  在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。
  如果程序中未声明析构函数,编译器将自动产生一个默认的析构函数。
  析构函数不返回任何值,没有函数类型,也没有函数参数。也不能重载。
 
静态数据成员:
  如果想在同类的多个对象之间实现数据共享,可以用静态的数据成员。静态数据成员是一种特殊的数据成员。它以关键字static开头。
  静态数据成员不属于某一个对象,在为对象所分配的空间中不包括静态数据成员所占的空间。静态数据成员是在所有对象之外单独开辟空间。只要在类中定义了静态数据成员,即使不定义对象,也为静态数据成员分配空间,它可以被引用。
  在一个类中可以有一个或多个静态数据成员,所有的对象共享这些静态数据成员,都可以引用它。
  静态数据成员是在程序编译时被分配空间的,到程序结束时才释放空间。
  静态成员变量不属于对象的一部分,而是类的一部分,所以程序可以在还没有诞生任何对象的时候就处理它。但首先你必须初始化它,但只能在类体外进行初始化。 
   int Box::height=10; //表示对Box类中的数据成员初始化

  一般形式为:

  数据类型  类名::静态数据成员名=初值;

  不必在初始化语句中加static。

  不能用参数初始化表对静态数据成员初始化。

  静态数据成员既可以通过对象名引用,也可以通过类名来引用。

  静态数据成员并不是属于对象的,而是属于类的,但类的对象可以引用它。
  静态数据成员被定义为私有的,则不能在类外直接引用,而必须通过公用的成员函数引用。
 
静态成员函数:
  在类中声明函数的前面加static就成了静态成员函数。如  static int volume( );
  静态成员函数是类的一部分,而不是对象的一部分。如果要在类外调用公用的静态成员函数,要用类名和域运算符“::”。如Box::volume( );
  也允许通过对象名调用静态成员函数,如a.volume( ); 但只是用a的类型而已。
  静态成员函数的作用是为了能处理静态数据成员。
  静态成员函数与非静态成员函数的根本区别是:非静态成员函数有this指针,而静态成员函数没有this指针。
  静态成员函数不能默认访问本类中的非静态成员。
 
继承与派生
  基类的函数必须具有virtual才能满足覆盖的条件。
  基类中的protected方法只能被派生类访问。
  派生类从基类公有继承,基类的公有成员和保护成员在派生类中仍然公有成员和保护成员。
  派生类从基类保护继承,基类的公有成员和保护成员在派生类中都变成保护成员。
  派生类从基类私有继承,基类的公有成员和保护成员在派生类中变成私有成员。
  隐藏是指 派生类的函数屏蔽了与其同名的基类函数。
  派基类的函数同名,参数不同,此时无论有无virtual关键字,基类的函数都被隐藏。(别和重载混淆)
  派基类的函数同名,参数相同,此时基类的函数被隐藏(别与覆盖混淆)
  构造函数先调用基类,然后再调用派生类。析构函数则相反。
 
posted @ 2012-09-08 14:59  仰望星空的耕田人  阅读(285)  评论(0编辑  收藏  举报