抽象(abstraction)与封装(encapsulation)
this
常量指针 隐式定义=default
C++11要求编译器生成构造函数,要有类内初始值public
private
class
struct
定义类唯一的区别就是默认的访问权限,前者private
,后者public
typedef std::string::size_type pos
或using pos = std::string::size_type
隐藏实现细节mutable size_t access_ctr
永远不会是const
;就算函数是const
成员函数也依然能改变其值this
指针强制访问static
explicit
抑制构造函数隐式转换,只对一个实参的构造函数有效,且只用在类内声明,类外不用;只能用于直接初始化,不能用于拷贝初始化friend
,只能出现在类的内部;一般最好在类定义开始或结束的位置声明友元friend class blablabla
或者友元成员函数 注意朋友的朋友不是朋友friend void f(); X() { f(); }
会报错public
的virtual
函数
string s(dots)
直接初始化 string s = dots
拷贝初始化=
定义变量=default
默认内联函数=delete
禁止拷贝/赋值
inline void swap(HasPtr &lhs, HasPtr &rhs)
{
using std::swap;
swap(lhs.ps, rhs.ps);
swap(lhs.i, rhs.i);
}
// 注意rhs是按值传递的,意味着HasPtr的拷贝构造函数
// 将右侧运算对象中的string拷贝到rhs
HasPtr& HasPtr::operator=(HasPtr rhs)
{
// 交换左侧运算对象和局部变量rhs的内容
swap(*this,rhs); // rhs 现在指向本对象曾经使用的内存
return *this; // rhs被销毁,从而delete了rhs中的指针
}
int i = 42; int&& rr = i * 42;
noexcept
,如StrVec::StrVec(StrVec &&s) noexcept :
:: .* . ?:
不可被重载,其余如new delete ~ () -> ->*
等均可被重载+ - * &
既是一元运算符,又是二元运算符,通过参数数量推断, & && ||
ostream &operator<<(ostream &os, const Sales_data &item)
不可为成员函数// 下标运算
std::string& operator[] (std::size_t n)
const std::string& operator[] (std::size_t n) const
// 前置后置递增/递减
StrBlobPtr& StrBlobPtr::operator++() // 前置
StrBlobPtr StrBlobPtr::operator++(int) // 后置
{
// 记录原来的值
StrBlobPtr ret = *this;
++*this;
return ret;
}
//显式地调用后置运算符
p.operator++(0);
p.operator++(); // 依然前置
operator()(int val) const
class PrintString{
public:
PrintString(ostream &o = cout, char c = ' '):
os(o), sep(c) { }
private:
ostream &os;
char sep;
};
PrintString errors (cerr, '\n');
errors(s);
// 函数对象常常作为泛型算法的实参
for_each(vs.begin(), vs.end(), PrintString(cerr, '\n'));
<functional>
头文件
vector<string*> nametable; sort(nametable.begin(), nametable.end(), less<string*>());
int(int,int)
输入两个int,返回一个intmap<string, int(*)(int,int)> binops
int add(int i,int j); binops.insert({"+",add});
pairfunction
标准库类型function<int(int,int)> f1 = add; // 函数指针
function<int(int,int)> f2 = divide(); // 函数对象类的对象
function<int(int,int)> f3 = [](int i, int j); // lambda
operator type() const;
explicit
,则需static_cast<int>(si) + 3;