c++Primer5,类设计者的工具

来源:互联网 发布:udp端口号范围 编辑:程序博客网 时间:2024/05/17 23:12
拷贝控制
  拷贝构造函数:
如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数。
如果没有定义拷贝构造函数,即使定义了其他构造函数,编译器也会合成一个拷贝构造函数。
T(const T&)
  拷贝赋值运算符:
使用=进行类对象赋值,如果类未定义自己的拷贝赋值运算符,编译器会为它合成一个。
T& operator=(const T&)
  析构函数:先执行函数体,后释放类对象的成员数据。
  =default:合成的函数将隐式地声明为内联的。
  =delete:声明为不可使用的函数。
  对象移动,右值引用等等鬼画符,pass。。。


操作符重载与类型转换
  重载的运算符是具有特殊名字的函数。如果一个运算符函数是成员函数,则它的第一个运算对象绑定到隐式的this指针上。
  对于一个运算符函数来说,它或者是类的成员,或者至少含有一个类类型的参数。
  只能重载已有的运算符,无权发明新的运算符。
  函数调用运算符的重载:()
如果类重载了函数调用符,则我们可以像使用函数一样使用该类的对象。
函数调用运算符必须是成员函数。该对象称为函数对象。
lambda是函数对象,被编译器翻译成一个未命名类的未命名对象。
当一个lambda表达式通过引用捕获变量时,将由程序负责确保lambda执行时引用对象确实存在。
类型转换运算符:type()
是类的一种特殊成员函数,它负责将一个类类型的值转换成其他类型。


面向对象程序设计:
  面向对象程序设计基于三个基本概念:数据抽象、继承和动态绑定。
  在c++语言中,基类必须将它的两种成员函数区分开来:一种时基类希望其派生类进行覆盖的函数;
  另一种是基类希望派生类直接继承而不要改变的函数。对于前者,基类通常将其定义为虚函数。
  当我们使用指针或引用调用虚函数时,该调用将被动态绑定。根据引用或指针所绑定的对象类型不同,
  该调用可能执行基类的版本,也可能执行某个派生类的版本。
  对于c++面向对象的编程来说,一个悖论是我们无法直接使用对象进行面向对象编程,相反,我们必须使用指针和引用!
  抽象基类:
含有(或者未经覆盖直接继承)纯虚函数的类时抽象基类,它不能创建对象。
  多写几个类,看完一个完整的小系统demo。


模版和泛型编程
  容器、迭代器和算法都是泛型编程的例子,当我们编写一个泛型程序时,时独立于任何特定类型来编写代码的。
  模版时泛型编程的基础,一个模版就是一个创建类或函数的蓝图或者说公式。
  模版函数:
template <typename T>
int compare(const T &v1, const T &v2)
{
if(v1 < v2) return -1;
if(v2 < v1) return 1;
return 0;
}
类模板:
template <typename T>
class Arr{
private:
vector<T> arr;
public:
void push_bace(const T &item){ arr.push_back(item); }
bool hasItem(const T &item);
T getFirstItem();
};


template <typename T>
bool Arr<T>::hasItem(const T &item)
{
for (auto &it : arr)
{
if (it == item)
{
return true;
}
}
return false;
}
template <typename T>
typename T Arr<T>::getFirstItem() //这里直接写“T Arr<T>::getFirstItem()”也可以
{
return arr[0];
}
后面关于模版的各种skill,技能点明显不足了,就略过了,个人不经常用到。。。。
0 0
原创粉丝点击