c++Primer5,类设计者的工具
2016-03-30 17:19
218 查看
拷贝控制
拷贝构造函数:
如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数。
如果没有定义拷贝构造函数,即使定义了其他构造函数,编译器也会合成一个拷贝构造函数。
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
4000
(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
4000
(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,技能点明显不足了,就略过了,个人不经常用到。。。。
相关文章推荐
- C++作业2
- C++11新特性(3) lambda表达式(1)
- 模拟实现c++标准库和boost库中的智能指针
- UVa Puzzle——C语言版本
- UVa227 Puzzle——C++版本
- C语言中const,volatile,restrict的用法总结
- C++基础知识
- C++作业2
- C++实验2-标准体重
- C++第二次博客
- (C++) System return error codes.
- const和#define的用法及区别
- 【poj 2479】Maximum sum 题意&题解&代码(C++)
- C++线程(一)
- C++之“友元类”学习笔记
- C语言中几种常见的内存操作函数(非调用)
- 键盘 C语言虚拟按键值表
- C++ 中如何用 vector类作为函数的参数
- C语言之常用字符串处理函数(非调用)
- C语言重要知识点回顾