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,技能点明显不足了,就略过了,个人不经常用到。。。。
拷贝构造函数:
如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数。
如果没有定义拷贝构造函数,即使定义了其他构造函数,编译器也会合成一个拷贝构造函数。
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
- c++Primer5,类设计者的工具
- C++Primer 第五版 3.类设计者的工具
- 链接器工具错误 LNK2019 C++primer5第十五章程序错误的解决
- c++Primer5,高级主题
- c++primer5 第一章
- c++primer5第二章
- c++primer5 3.17
- c++primer5 3.20答案
- c++primer5 题3.24
- C++primer5 题3.25
- c++primer5 题3.36
- 类设计者的建议
- 类设计者的核查表(转自C++rumination)
- 重新学习《C++Primer5》第7章-类
- c++Primer5--如何选择类型
- C++Primer5 笔记--迭代器运算
- 类设计者的核查表
- 类设计者的核查表
- Android官方开发文档Training系列课程中文版:与其它APP交互之允许其它APP启动你的Activity
- 机器人--机器视觉的魅力
- opengl之绘制一个矩形
- Struts2使用MethodFilterInterceptor来实现方法拦截器
- ubuntu9.10使用apt-get时找不到下载源问题
- c++Primer5,类设计者的工具
- CAGradientLayer基本使用方法
- 【暑假】[网络流]网络流知识总结
- 【暑假】[基本数据结构]根据BFS与DFS确定树
- 【暑假】[基本数据结构]根据in_order与post_order构树
- 【暑假】[基本数据结构]基本的数据结构知识点总结梳理
- 初学者关于ztree的浅谈
- 【暑假】[实用数据结构]动态连续和查询问题
- 【暑假】[实用数据结构]范围最小值问题(RMQ)