C++ 复习笔记 (之一)
因为是自己复习时候的笔记,跳跃性比较大。
(1)const 放在成员函数前和放在成员函数后
放在前面表示返回类型:
void const getPt(int, int):
https://blog.csdn.net/lz20120808/article/details/46662569
放在成员函数后:表示不改变成员函数类型
void SetPt (int, int) const;
void OffsetPt (int, int) const;
(2)抽象類就是virtual,沒有abstract,不能和java搞在一起
(3)auto
一般auto 是自动转换类型,动态语言的实现,不是在编译时候进行转换,而是运行时候生成。C++ 是静态语言,而相比之下Python这类动态语言,也就是在运行时能够自动进行类型生成和转换比较受到欢迎,在C++11之后(14,17,18)就开始吸收别的语言的有点。
auto f = 3.14; //double
auto s("hello"); //const char*
auto z = new auto(9); //int *
auto x1 = 5, x2 = 5.0, x3 = 'r';
在使用vector 容器中的iterator以及const_iterator 的时候,auto 比较好用:
vector<string> stringVector(10,"hello");
for (auto iter = cbegin(stringVector); iter != cend(stringVector): ++iter) {
cout << *iter << endl;
}
(4)移动语义:
所有的STL容器都包含了移动构造函数和移动赋值运算符,从而实现移动语义。这样做的一大好处是可以通过传值的方式从函数返回STL容器,而不会降低性能。
vector<int> createVectorOfSize(size_t size)
{
vector<int> vec(size);
int contents = 0;
for (auto& i : vec ) {
i = contents++;
}
}
vector<int> myVector;
myVector = createVectorOfSize(123);
如果没有移动语义,会从函数中返回vec 的 拷贝副本,赋予 myVector. 使用移动语义可以回避拷贝。例如:
class Element
{
public:
Element(int i, const string& str) : mI(i), mStr(str) {}
private:
int mI;
string mStr;
};
vector<Element> vec;
移动语义实现:
vec.push_back((12, "Twelve"));
(5)构造函数的delete
RoundRobin(const RoundRobin& src ) = delete
可以抑制一部分构造函数的默认生成,替代private 方式
https://blog.csdn.net/u012333003/article/details/25299939
(6) Typename:
Typename std::vector<T>::iterator mCurElem;
Typename (1)用于指定模板参数,即泛型编程(模板编程)的功能,(2)当模板参数 用于访问迭代器类型,则必须指定typename