C++11 学习札记(一)

最近在看cocos3.2的源码,碰到一些不是很熟悉的c++11新语法代码, C++11 之前有个系统的学习,但是又似乎有些

忘却了, 所以还是做些学习笔记,以备日后学习参考:

item1,新增显式关键字 override和final (似乎闻到C++在妥协的味道)

final用来显示约束继承,如 struct C final {xxx} ;class C final {xxx};那么C包不能再被作为其他类的父类进行继承。

这对于类中的函数也成立的:

struct C
{
    virtual void f() final {} // final 函数
};
 
struct C1 : C
{
    virtual void f() {}
};
对于这种重写操作,同样具有约束作用。

override参数也是类似的,这两个关键字可以让编译器帮我们预先发现错误,如下:

struct B3
{
    virtual void f() {}
};
 
struct D3 : B3
{
    void f() {}
};
对于上面的覆盖操作,如果借助override关键字可以更加清晰的防止一些低级错误的发生。

struct B4
{
    virtual void g(int) {}
};
 
struct D4 : B4
{
    virtual void g(int) override {} // OK
    virtual void g(double) override {} // Error
};
这些并不是一些简单的语法糖,一来编译器确确实实为我们做了很多的检查,二来编译器也做了些优化,如上面的C::f(), 编译器能识别出这个函数不能被

覆盖,因此会将其从类的虚表中删除,而对于final类,编译器根本就不会为其生成虚表。

item2,lambda函数与表达式

[](int x, int y) {return x+y;}, 定义了一个匿名块,这个临时函数返回类型为decltype(x+y), 具体可参看wiki

http://zh.wikipedia.org/wiki/C%2B%2B11#Lambda.E5.87.BD.E5.BC.8F.E8.88.87.E8.A1.A8.E7.A4.BA.E5.BC.8F

item3,std::function 和 std::bind

function模板类和bind模板函数,使用它们可以实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类 的非静态成员函数时。
std::function可以绑定到全局函数/类静态成员函数(类静态成员函数与全局函数没有区别),如果要绑定到类的非静态成员函数,则需要使用std::bind。

#include 
#include 
using namespace std;

typedef std::function fp;
void g_fun()
{
	cout<<"g_fun()"< fpi;
		//对于参数要使用占位符 std::placeholders::_1
		fpi f=std::bind(&A::A_fun_int,this,std::placeholders::_1);
		f(5);
	}
};
int main()
{
	//绑定到全局函数
	fp f2=fp(&g_fun);
	f2();

	//绑定到类静态成员函数
	fp f1=fp(&A::A_fun_static);
	f1();

	A().init();
	A().init2();
	return 0;
}

#include 
#include 
using namespace std;

typedef std::function fp;

class A
{
public:
	virtual void f()
	{
		cout<<"A::f()"<init();

	return 0;
}

参考文章:

http://blog.csdn.net/qq575787460/article/details/8531397




你可能感兴趣的:(编程&语言)