文章目录
#C++面向对象程序设计
class without pointer members
基于对象(Object Based):单个class的设计;C++中classes的两个经典的分类:
- class without pointer members
- 可以使用默认的拷贝构造函数和拷贝赋值函数
- 默认的拷贝构造函数和拷贝赋值函数由编译器根据需要自动生成,执行浅拷贝
- 不带指针的类多半不需要析构函数
- class with pointer members
- 最好是自定义拷贝构造函数和拷贝赋值函数,自定义实现深拷贝
- 一般需要析构函数
面向对象(Object Oriented):多重 classes 的设计,classes和classes之间的关系;classes之间的关系有:
- 继承(inheritance)
- 组合(composition)
- 委托(delegation)
C++历史:
B语言(1969)-> C语言(1972)-> (new C -> C with Class -> C++(1983))
C++演化:
C++ 98(1.0)-> C++ 03(TR1)-> C++ 11(2.0)-> C++ 14
C++包括两部分:C++语言和C++标准库
inline函数:inline是C++编译器提供的一种特性。在函数前面加 inline 关键字,只是对编译器的建议,告诉编译器,你尽量帮我inline,最终是否inline,由编译器决定,对于太复杂的程序,编译器可能没能力将其变成inline。
- 函数太复杂,无法inline
- 函数体在class中已经定义完成,便自动成为inline候选者
- 在class中声明函数时可以先不写inline关键字,在class外部实现定义的时候再加inline也可以
friend(友元)函数:打破了 C++ 的封装的大门,类的友元函数能直接拿到该类对象的私有数据,而其他的普通函数只能通过接口访问对象的私有数据。相同class的各个 objects 互为 friends(友员)。
class complex {
...
// 相同class的各个 objects 互为 friends(友员)
int func(const complex ¶m) {
return param.re + param.im; // 可直接访问 私有数据
}
private:
double re, im;
};
overloading(函数重载):函数名称一样,但是函数的参数个数或参数类型不一样或有无 const,与返回值类型无关。
operator overloading(操作符重载):在C++中很重要,操作符可重载为以下两种函数:
- 成员函数
- 任何的 non-ststic 成员函数都有一个隐藏的 this 指针
- 非成员函数(global函数)
<<
只能重载为非成员函数(友元或非友元都可)
一个class的成员类型:
- data members
- non-static data members(每个 objects 都有一份属于自己的data)
- static data members(class所有,所有 objects 共享该data,可被 non-static 或 static member functions 或 global functions 访问或修改(如果有足够权限的话))
- member function
- non-static member functions(含有隐藏的 this 指针,可操作 non-static data members 和 static data members)
- static member functions(没有this指针,只能操作 static data members)
- 调用 static 函数的方式有二:
- 1)通过 object 调用
- 2)通过 class name 调用
- 调用 static 函数的方式有二:
- const member functions(常量成员函数,不改变对象的data)
- 在创建对象的时候,如果在class前面加 const,表示不想修改这个将要被创建出来的对象的数据,那么该对象之后的函数调用只能调用 const member functions,如果调用 non-const member functions,则会出现编译错误。
temp obbject(临时对象):typename();
临时对象没有名称,生命期到下一行就结束,标准库中应用的较多。
complex operator + (const complex &x, const complex &y) {
return complex(x.real