主要尝试了一下 函数重载 函数模板 右值操作。 C++11的新特性。
//
// main.cpp
// C_Primer_Plus_3
//
// Created by Ben_22 on 14-5-12.
// Copyright (c) 2014年 Ben_22. All rights reserved.
//
#include <iostream>
#include <string>
using namespace std;
string version1 ( conststring &s1,const string &s2);
const string & version2(string &s1,const string &s2);
const string & version3(conststring &s1, const string &s2);
int getVal(int x){
return x;
}
template <class T1, class T2>
void add(T1 a, T2 b){
//?type? c = a + b; C98里面不允许这样定义表达式
decltype(a + b) c;//C++11把c定义为与a+b一样的类型
c = a + b;
}
//针对返回值不为void的函数模板的定义
template <class T1, class T2>
auto getAdd( T1 a, T2 b) -> decltype(a+b)
{
decltype(a + b) c;
return c = a+b;
}
template <class T>
void Swap( T &a, T &b);
typedef struct job{
char name[20];
int first;
int second;
}job;
//函数模板的显示具体化,只交换部分参数的值
//template <> void Swap<job>(job &a, job &b){
//
//}
int main(int argc, const char * argv[])
{
//引用
string a = "ben ";
string b = "####";
cout<< version2(a, b)<< a <<"^ ^"<< b <<"^ ^"<<endl;
//函数version3存在致命缺陷编译器会告警,但是不会报错。因为引用了被释放的内存。
string strResult = version3(a,"abc");
cout<<strResult<<endl;
//何时应该使用引用参数
// 1 修改调用函数中的数据对象
// 2 提高运算效率
//左值引用 右值引用
int x;
// int &value = getVal(x); //错误的左值引用的是不稳定的空间,所有如果不定义为const的话就可以给右值赋值,而右值又不允许被赋值,所有报错。
constint &value =getVal(x);//C++11 允许使用一个const的左值来绑定一个右值。
//在C++11中,我们可以显示地使用“右值引用”来绑定一个右值,语法是"&&"。因为指定了是右值引用,所以无论是否const都是正确的。
int &&mValue = getVal(x);
//函数模板
double dA = 2.23;
double dB = 1.34;
Swap(dA, dB);
cout<<dA<<" "<<dB<<endl;
return 0;
}
template <class T>
void Swap( T &a, T &b){
T tmp;
tmp = a;
a = b;
b = tmp;
}
string version1 ( conststring &s1,const string &s2){
string temp;
temp = s2 + s1 + s2;
return temp;
}
const string &version2(string &s1,const string &s2){
s1 = s2 + s1 + s2;
return s1;
}
const string & version3(conststring &s1, const string &s2){
string temp;
temp = s2 + s1 + s2;
return temp;
}