C++ 虚函数和纯虚函数 virtual 友元函数和友元类 override const

1)  公有继承c++

  纯虚函数      => 继承的是:接口 (interface)程序员

  普通虚函数   => 继承的是:接口 + 缺省实现 (default implementation)ide

  非虚成员函数 =>继承的是:接口 + 强制实现 (mandatory implementation)函数

2)  不要从新定义一个继承自基类的非虚函数 (never redefine an inherited non-virtual function)spa

3)  override:能够显式的在派生类中声明,哪些成员函数须要被重写,若是没被重写,则编译器会报错。指针

const修饰成员函数c++11

(1)该成员函数不能修改任何的成员变量(mutable修饰的变量除外)code

(2)该成员函数不能调用非const成员函数,由于非const成员函数可能会修改为员变量对象

virtual

虚函数是在基类中使用关键字 virtual 声明的函数继承

虚函数最关键的特色是“动态联编”,它能够在运行时判断指针指向的对象,并自动调用相应的函数。

虚函数是指一个类中你但愿重载的成员函数 ,当你用一个  基类指针或引用   指向一个继承类对象的时候,调用一个虚函数时, 实际调用的是继承类的版本。

纯虚函数  :virtual int area() = 0;

virtual type <function>() const=0

成员函数后面用 const 修饰,通俗的理解就是在这个函数内不能修改类的成员变量,除非那个成员变量是   mutable   的   

virtual void print() const = 0;
(1)=0说明它是纯虚函数,没有定义,只有接口,由子类继承实现
(2)const代表不能修改其数据成员

 

class aa{
    int num;
public:
    aa(){
        int b =10;
        num = b;
    };
    void out1(){
        cout<<num<<endl;
    }
    void out2() const{
        cout<<num<<endl;
    }
    void out3() const{
        num+=10; //出错,const函数不能修改其数据成员
        cout<<num<<endl;
    }
}

 

友元的正确使用能提升程序的运行效率,但同时也破坏了类的封装性和数据的隐藏性,致使程序可维护性变差。

友元函数 

友元函数是能够直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但须要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式以下: 

friend 类型 函数名(形式参数);

友元类  
      友元类的全部成员函数都是另外一个类的友元函数,均可以访问另外一个类中的隐藏信息(包括私有成员和保护成员)。        
      当但愿一个类能够存取另外一个类的私有成员时,能够将该类声明为另外一类的友元类。定义友元类的语句格式以下: 
      friend class 类名; 
      其中:friend和class是关键字,类名必须是程序中的一个已定义过的类。

使用友元类时注意: 
          (1) 友元关系不能被继承。 
            (2) 友元关系是单向的,不具备交换性。若类B是类A的友元,类A不必定是类B的友元,要看在类中是否有相应的声明。 
            (3) 友元关系不具备传递性。若类B是类A的友元,类C是B的友元,类C不必定是类A的友元,一样要看类中是否有相应的申明

inline 避免了频繁调用函数对栈内存重复开辟所带来的消耗,好比递归函数,inline仅是一个对编译器的建议 inline的使用是有所限制的,inline只适合函数体内代码简单的函数使用,不能包含复杂的结构控制语句例如while、switch,而且不能内联函数自己不能是直接递归函数(即,本身内部还调用本身的函数)。

 

c++11 类默认函数的控制:"=default" 和 "=delete"函数

C++ 的类有四类特殊成员函数,它们分别是:默认构造函数、析构函数、拷贝构造函数以及拷贝赋值运算符。
这些类的特殊成员函数负责建立、初始化、销毁,或者拷贝类的对象。
若是程序员没有显式地为一个类定义某个特殊成员函数,而又须要用到该特殊成员函数时,则编译器会隐式的为这个类生成一个默认的特殊成员函数。
C++11 标准引入了一个新特性:"=default"函数。程序员只需在函数声明后加上“=default;”,编译器将为显式声明的 "=default"函数自动生成函数体。

 "=default"函数特性仅适用于类的特殊成员函数,且该特殊成员函数没有默认参数。

"=default"函数既能够在类体里(inline)定义,也能够在类体外(out-of-line)定义。

class X
{
public:
    X() = default; //该函数比用户本身定义的默认构造函数得到更高的代码效率

}

// 为了可以让程序员显式的禁用某个函数,C++11 标准引入了一个新特性:"=delete"函数。程序员只需在函数声明后上“=delete;”,就可将该函数禁用。
class X3
{
public:
    X3();
    X3(const X3&) = delete;  // 声明拷贝构造函数为 deleted 函数
    X3& operator = (const X3 &) = delete; // 声明拷贝赋值操做符为 deleted 函数
};

// "=delete"函数特性还可用于禁用类的某些转换构造函数,从而避免不指望的类型转换
class X4
{
public:
    X4(double)
    {

    }

    X4(int) = delete;
};

// "=delete"函数特性还能够用来禁用某些用户自定义的类的 new 操做符,从而避免在自由存储区建立类的对象
class X5
{
public:
    void *operator new(size_t) = delete;
    void *operator new[](size_t) = delete;
};
相关文章
相关标签/搜索