目录
1、C+代码基本形式
2、Header (頭文件) 布局以及class声明
3、class template (模板)
定义方式:template<typename T>
private里面是不能改变参数类型的,我们通过引入template模版,定义不同typename(int/double/float等)类型,将private里面的类型参数化。
4、inline内联函数
概念:inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义,解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题。
注意:
a、inline的使用是有所限制的,inline只适合涵数体内代码简单的涵数使用,不能包含复杂的结构控制语句例如while、switch,并且不能内联函数本身不能是直接递归函数(即,自己内部还调用自己的函数)。
b、inline函数仅仅是一个对编译器的建议,所以最后能否真正内联,看编译器的意思,它如果认为函数不复杂,能在调用点展开,就会真正内联,并不是说声明了内联就会内联,声明内联只是一个建议而已。
c.定义在类中的成员函数缺省都是内联的,如果在类定义时就在类内给出函数定义,那当然最好。如果在类中未给出成员函数定义,而又想内联该函数的话,那在类外要加上inline,否则就认为不是内联的。
5、access level (訪問級別)
概念: 类之外不能直接调用private里面的参数,只能在类内定义函数来传递值,如下图所示:
6、构造函数初始化
成员变量再构造函数中初始化中使用":"函数方式性能比直接在构造函数中赋值要快,建议使用这种方式。
7、构造函数重载:构造函数有多种不同的参数传人
黄色标注的构造函数定义将出现问题,如果该函数与上面构造函数同时出现,在无参初始化该类对象时将产生冲突,因为第一个构造函数已经有参数默认初始化列表了,定义该类对象时可以不加入参数,这就产生了冲突。
8、 常量成员函数:最好加入const
在一个类中,如果成员函数中没有改变成员函数操作(例如get操作),那么建议在该方法声明处加入const关键字,如果不加入const关键字,那么c++编译器将认为该函数可能会修改类的成员变量。这样做有个好处,可以看到上图的"?!"一图,使用者利用了const关键字定义并通过构造函数初始化了一个complex类,这个类将不能被修改,只能读取属性。当使用者调用complex的real()或者imag()方法时,如果这两个方法在定义处没有加入const关键字,那么将报错。
9、参数传递和返回值都是用const引用
函数参数传递,如果不需要改变参数值,建议使用const reference减小开销。
返回值建议使用引用,但如果返回引用的是该函数的一个指向堆局部变量指针,例如*ptr,那么不能使用引用,因为该局部变量在函数调用后就以及销毁了,引用可以认为是给当前对象换了个别名,如果当前对象已经被销毁,那么该“别名”也就失去了意义,不存在了。
当然,如下图所示,对于临时变量也不能返回引用:
10、友元函数:只有朋友才能访问我私有参数
11、运算符重载this指针
在运算符重载过程中隐藏了this指针,该指针编译器会处理,使用者不能显式声明。
code
#include<iostream>
using namespace std;
class A
{
public:
//构造函数
A();
//重载:构造函数有多种不同的参数传人
A(int a = 0, int b = 0):i(a),j(b){ }
//析构函数
~A();
int get_i()const {return i;}
int get_j()const {return j;}
private:
int i, j;
};
A::A()
{
cout << "执行默认构造函数" << endl;
}
A::~A()
{
cout << "执行析构函数" << endl;
}
int main ()
{
A a(1,2);
cout << a.get_i() << ' ' << a.get_j()<<endl;
A b(1);
cout << b.get_i() << ' ' << b.get_j()<<endl;
}