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 int area() = 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++ 的类有四类特殊成员函数,它们分别是:默认构造函数、析构函数、拷贝构造函数以及拷贝赋值运算符。
这些类的特殊成员函数负责建立、初始化、销毁,或者拷贝类的对象。
若是程序员没有显式地为一个类定义某个特殊成员函数,而又须要用到该特殊成员函数时,则编译器会隐式的为这个类生成一个默认的特殊成员函数。
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; };