本周进行的是“革命尚未成功,同志仍需努力”这段话中,那众多细小但重要的细枝末节。
以下是他们的罗列
- Conversion Function
- non-explicit one argument constructor
- pointer-like classes
- Function-like classes
- namespace经验谈
- class template
- Function Template
- Member Template
- specialization
- 模板偏特化
- 模板模板参数
- 关于C++标准库
- 三个主题
- Reference
- 复合&继承关系下的构造和析构
其实老实说,这周并没有着重讲函数的虚表vptr,但是作业却是这样。是不是我遗漏了什么,还是说课程之前进行过改动,但作业没有变动。以下,记录一下它们的内容,当然,有些内容之前的课程其实有提过的,那么就没有必要过多强调。
1. conversion function
本周首先讲到的就是上一周遗留下来的那个operator type()。它可以在你认为合理的时候,自动的把一个class转换成为另一个类型。转换函数在函数名前面不能指定函数类型,函数也没有参数,至于是否要加const,根据转换后的结果来判定,一般都会加上const。在使用过程中,不必显示地调用类型转换函数,它往往是自动被调用的,即隐式调用。
2. non-explicit one argument constructor
explicit关键词可以防止编译器自动的从一种类型隐式的自动的调用class的constrctor,这样可以防止某些你无法预见的结果。所以最好是加上。大多数情况下,这个关键词只用于ctor。
3. pointer-like classes
实际上就是构造了一种智能指针
4. function-like classes,所谓仿函数
5. namespace,即命名空间
命名空间的使用是非常好的习惯,因为假如几个人同时在一个project进行开发,如果事先大家没有交流过的话,那么有很大几率,写出来的class或者struct还有function有重名的可能。如果在这些代码中加入命名空间的限定,那么就完全不需要担心了
6. 类模板
事实上,类模板是泛型编程的一种方式。实现不指定类中某些数据的类型,在使用的时候才进行实际的生成
7. 函数模板
与类模板类似,可以和类模板一同使用
8. 成员模板
在类模板内部,还可以设置成员模板,举例子来说,就是
template <typename T1, typename T2>
struct pair
{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair()
:first(T1()), second(T2())
{}
pair(const T1& a, const T2& b)
:first(a), second(b)
{}
template <typename U1, typename U2>
pair(const pair<U1, U2>& p)
: first(p.first), second(p.second)
{}
};
9. specialization,也叫模板全特化
针对类模板或者模板类的实现时,可以在模板参数比较特别的时候,单独指定一种特殊实现方式。而且这种时候,模板的所有参数都额外指定了。否则就称为偏特化
10. 模板偏特化
11. template template parameter,模版模版参数
12. Reference
13. variadic templates (since C++11)
这个东西叫做可变模板参数。模板参数在2.0之前都是固定的,但是这里,Bang,可以变化了。那么有一些固定的编译器给定的新关键字,教学课件中有如下的代码
void print()
{
}
template <typename T,typename... Types>
void print(const T& firstArg, const Types&... args)
{
cout << firstArg << endl;
print(args...);
}
其中...
这种是必须要写的。如果想获取args这个包里面参数的个数,可以用sizeof...(args)
来取得。
14. auto (since C++11)
auto是新的特性,可以让编译器自动的为我们添加变量的类型声明
比如原有代码的样子,我们实现声明ite的类型是list<string>的迭代器
list<string> c;
...
list<string>::iterator ite;
ite = find(c.begin(),c.end(),target);
使用auto之后,编译器自动指定ite的类型是c这种东西的迭代器,c是list<string>,所以代码运行时通过的。
list<string> c;
...
auto ite = find(c.begin(),c.end(),target);
15. ranged-base for (since C++11)
C++2.0中提供了新的for循环格式,如下
for (delc : coll)
{
statement;
}
其中,coll是个容器,编译器看到后,会进到容器中,把一个一个的元素取出来,放到前面的delc中,同时执行下方的statement语句。因此,可以有更加简洁的代码,比如说下面的代码
vector<double> vec;
…
for (auto elem : vec)
{
cout << elem << endl;
}
for (auto& elem : vec)
{
elem += 3;
}
总的来说,本周的C++内容已经开始从一马平川向着攀登珠峰在进发了,所述的内容也从初学者的知识掌握渐渐转变为更加底层更加高端的实际用法。这个时候,如果掌握好了,那么对后面是起到良好的基础的作用,不然就真的要打退堂鼓了。
网友评论