C++ 扫盲学习

来源:互联网 发布:芝华仕沙发头等舱 知乎 编辑:程序博客网 时间:2024/05/01 03:36

1.继承:

C++ 的继承用冒号“:”,

如class A:public B

其中B前面的public是访问权限的一个标志,

共有三个最低权限级别:private  protected  public

class A:private B //从B中继承来的成员变量和方法的属性全部变成private
class A:protected B //从B中继承来的所有public方法的属性变成protected
class A:public B //从B中继承来的成员变量和方法保持原有属性

实现多重继承时,基类间用“,”号隔开

class CRectangle: public CPolygon, public COutput {

不能被继承的:1.构造函数和析构函数 2.纯虚拟函数 3.友善关系

虽然基类的构造函数和析构函数没有被继承,但是当一个子类的object被生成或销毁的时候,

其基类的默认构造函数 (即,没有任何参数的构造函数)和析构函数总是被自动调用的。

如果基类没有默认构造函数,或你希望当子类生成新的object时,基类的某个重载的构造函数被调用,

你需要在子类的每一个构造函数的定义中指定它:
derived_class_name (parameters) : base_class_name (parameters) {}

2.类中方法可以在类中声明,在类外定义,使用双冒号进行声明:
范围操作符 (::) 声明了被定义的成员所属的class名称,并赋予被定义成员适当的范围属性,这些范围属性与在class内部定义成员的属性是一样的。

例如,在下面的例子中,我们在函数set_values() 中引用了private变量x 和 y,这些变量只有在class内部和它的成员中才是可见的。

在class内部直接定义完整的函数,和只定义函数的原型而把具体实现放在class外部的唯一区别在于,在第一种情况中,

编译器(compiler) 会自动将函数作为inline 考虑,而在第二种情况下,函数只是一般的class成员函数:

  #include <iostream.h> class CRectangle {int width, height;  public:void set_values (int, int);int area (void) {return (width * height);}friend CRectangle duplicate (CRectangle);  }; void CRectangle::set_values (int a, int b) {width = a;height = b;     } CRectangle duplicate (CRectangle rectparam) {CRectangle rectres;rectres.width = rectparam.width*2;rectres.height = rectparam.height*2;return (rectres);      } int main () {CRectangle rect, rectb;rect.set_values (2,3);rectb = duplicate (rect);cout << rectb.area();      }


 

3.友善类和友善函数:
 在类中声明一个函数和一个类为友善的,可使友善函数和类访问类中的private和protected属性的成员变   量和方法。

友善类声明:friend class CRectangle;

 友善函数声明:friend CRectangle duplicate (CRectangle);

4.抽象类和虚拟函数
  虚拟函数:在函数的前面 加关键字virtual:
          virtual int area (void) { return (0); }

 纯虚拟函数:在函数名前面加关键字virtual,不用定义,直接后面加=0;
        virtual int area (void) =0;

  包含纯虚拟函数的为抽象类,不能直接实例化对象。
  可以用指向基类的指针实现向上转型,指向基类的指针只能调用在基类中定义过的的函数,
  可以在基类中加虚拟或纯虚拟函数,在子类中重写,用指向基类的指针调用方法,
  可调用相应子类的重写的方法,实现多态特性。

5.模板

  模板按其字面意思是定义好一个模子,参数为泛类型,不收参数类型的限制,如我定义一个函数,

  传入int可以,传入long也可以,定义的时候有一定的格式要求,

  函数模板:

  template <class T> T GetMax (T a, T b) {           return (a>b?a:b);        }   int main () {          int i=5, j=6, k;          long l=10, m=5, n;          k=GetMax(i,j);          n=GetMax(l,m);         cout << k << endl;         cout << n << endl;         return 0;        }

类模板:

   template <class T> class pair {      T value1, value2;      public:pair (T first, T second) {        value1=first;        value2=second;    }    T getmax ();   };   template <class T> T pair::getmax (){    T retval;    retval = value1>value2? value1 : value2;    return retval;    }  int main () {    pair  myobject (100, 75);    cout << myobject.getmax();    return 0;   }

  当然也有模板的特殊化,即可指定特定的数据类型:
  template <> class pair <int> {。。。}

6. 命名空间就是把全局范围分割成许多子域范围,一个子域范围用一个名字来表示:

 #include <iostream.h>namespace first {    int var = 5;}namespace second {    double var = 3.1416;}int main () {    cout << first::var << endl;    cout << second::var << endl;    return 0;}

上面的调用相应空间中的成员变量都使用范围操作符::,

当然还有另外一种的方式即using namespace:

 #include <iostream.h>namespace first {    int var = 5;}namespace second {    double var = 3.1416;}int main () {    using namespace second;    cout << var << endl;    cout << (var*2) << endl;    return 0;}

这里要注意,语句using namespace 只在其被声明的语句块内有效(一个语句块指在一对花括号{}内的一组指令)。



0 0
原创粉丝点击