c++ primer 笔记
1. 类成员声明的名字查找(声明就是不要实体部分==“{}”)
首先在名字使用之前的类成员的声明
之后在包含类定义的作用域中出现的声明以及之前的声明
类成员定义的名字查找(定义就是实体部分 == “{}”)
首先检查在成员函数局部作用域中的声明
如果找不到,检查所有类成员的声明
如果再找不到,就找这个函数定义之前的作用域出现的声明
2. 构造函数初始化数据成员的顺序就是数据成员在类定义中的定义顺序。和初始化列表木有关系。
3. explicit可以限制构造函数引起的隐式转换,但是explict仅仅只能在类内部的构造函数的声明上
#include<string>
#include<iostream>
usingnamespace std;
class A
{
public:
A()
{
cout<<"defaultconstruct"<<endl;
}
explicit A(string str)
{
v_str = str;
cout<<"v_stris "<<v_str<<endl;
}
string v_str;
};
intmain()
{
A a;
A b = "hello";
return 0;
}
这样就会报错
error: conversion from ‘const char [6]’ to non-scalar type‘A’ requested
4. ①不能重载的操作符有
全局:: 、.* 、? :、.
②重载操作符必须得有一个类类型的操作数
③优先级和结核性是固定的
④不在具备短路求值特性比如&&
⑤重载的函数可以使类成员或者非成员,就是函数的操作数不一样了。
⑥操作符 重载不是类的成员时,一般都需要定义成类的友元,因为操作符就是处理成员变量的,一般的成员变量都是私有的。
5. 关于虚函数:除了构造函数,任意非static成员函数都可以是虚函数,保留字virtual仅仅在类内部的成员函数声明中出现,不能在类定义体外部出现的函数定义上。
6. 模板类型参数不能为空 class和typename是没有区别的
7. incline 函数这个key word放在template<class T> 之后函数返回值之前
template <class T> incline int compare(T &v1,T&v2);
模板形参可是 类型形参或者非类型形参。如果是非类型形参,表示的是一个值
用作模板形参 不能在模板内部重复使用。
8. 在模板中如果在内部使用自定义类型的时候,必须在前面加上 typename,这样才不会被当做值来处理
9. 模板形参的实参必须完全匹配,否则会出现编译出错。而且不会出现类型的隐式转换,像short 和int 这种类型实参,对于模板来说会生成两类模板。
10. 如果模板形参不是引用类型,那么数组名称会退化成指针,如果是引用类型,数组长度和类型必须一致
11.