C++的技术探究

C++深究

函数指针

double pam(int, double); // prototype
double (*pf)(int, double); // declare function pointer
pf = pam; // pf now points to the pam() function
double y = (*pf)(1, 5); // call pam() using pointer pf

内联函数

适用范围:不是递归调用的函数;函数多次被调用;

inline double square(double x) {
	return x * x;
}

函数模板

// non template function prototype
void Swap(job &a, job &b);
// template prototype
temple<class T>
void Swap(T &a, T &b);
// explicit specialization for the job type
template<> void Swap<job>(job &a, job &b);

关键字decltype

int x;	double y;
decltype(x + y) xpy; // make xpy the same type as x + y

关键字explicit

作用:防止隐式转换

class A {
private:
	string s;
public:
	A(string _s = "") : s(_s) {}
	int compare(const A& other);
};

class B {
private:
	string s;
public:
	explicit B(string _s = "") : s(_s) {}
	int compare(const B& other);
};

int main() {
	A a;
	a.compare("Valid"); // Is valid to do that
	B b;
	b.compare("InValid"); // Is invalid to do that
	return 0;
}

关键字auto

作用:自动推导变量类型

vector<int> v;
auto it = v.begin();

运算符dynamic_cast

作用:判断指针pg的类型是否被安全地转换为Superb*。如果可以,运算符将返回对象的地址,否则返回一个空指针。

class Superb : public Grand {...}
Grand *pg = new Grand;
Superb *pm = dynamic_cast<Superb*>(pg);

运算符typeid

作用:确定两个对象是否为同种类型

typeid(Grand) == typeid(*pg);

运算符const_cast

作用:删除const typename* 中的const,当且仅当指向的值的声明是非const的时候有效

void change(const int *pt, int n) {
	int *pc = const_cast<int*>(pt);
	*pc += n;
}
int pop1 = 38383;
change(&pop1, -103); // valid
const int pop2 = 2000;
change(&pop2, -103); // invalid

运算符static_cast

作用:可隐式转换的时候才生效

High bar;
Low blow;
High *pb = static_cast<High*>(&blow); // valid
Low *pl = static_cast<Low*>(&bar); // valid
Pond *pmer  = static_cast<Pond*>(&blow); // invalid

运算符reinterpret_cast

作用:天生危险的类型转换

struct dat {short a, b};
long value = 0xaaaaaaaa;
dat *pd = reinterpret_cast<dat*>(&value); // valid

智能指针auto_ptr

作用:离开作用域的时候自动调用析构函数释放动态内存

void function() {
	auto_ptr<double> ap(new double);
	*ap = 2.333;
	return;
}

智能指针shared_ptr

作用:跟踪引用特定对象的智能指针数,当最后一个指针过期时,才调用delete

智能指针unique_ptr

作用:唯一所有权(ownship),不允许智能指针直接拷贝赋值

Lambda函数

作用:允许使用匿名函数
说明:&表示引用变量,=表示取值变量

[](int x) {return x % 3 == 0;}
bool f(int x) {return x % 3 == 0;}
[&count, =sock]() {count++;}

包装器function

作用:用作形式参数,作为一个function包装器对象

template<class T>
T use_f(T v, std::function<T(T)> f);

function<double(int, char)> f;
// 等价于
double f(int, char);

可变参数模板

作用:传递未知数量的参数

void print() {}

template<class T>
void print(T value) {
	std::cout << value << std::endl;
}

template<class T, class... Args>
void print(T value, Args... args) {
	std::cout << value << ", ";
	print(args...);
}
posted @ 2016-05-11 16:08  Wsine  阅读(771)  评论(0编辑  收藏  举报