C++【侯捷】——— 可变参数、ranged-base、auto和引用

C++【侯捷】——— 可变参数、ranged-base、auto和引用


最好是都要了解下,知道标准库都给了什么方法,自己试试,在使用的时候就知道有哪些了,不用自己再傻傻的去写已经有的。
查看不同的编译,了解不同版本所支持的C++版本,两种方式:1、通过网页上查,2、打印__cplusplus的宏。

variadic templates

void print()
{
}
template <typename T, typename... Types>
void print(const T& firstArg, const Types&... args)
{
  cout << firstArg << endl;
  print(args...); 
}

模板的参数个数不定,第二个print将参数分成一个和一包。上面的就会进行递归的调用,依次分解。到最后应该是0个,不能调用就得用上面的第一个print函数。使用的方法可以不限于递归,可以用到继承和组合中。使用sizeof…(args)可以得到后面第二个参数的个数。

auto

list<string> c;
...
auto ite = find(c.begin(), c.end(), target);

ite的真实类型是:list::iterator,相当于:list::iterator ite;
编译器会根据右面的情况推出来类型,但是用auto必须要有赋值才能推导出类型,下面的这种就不行:

auto ite;
ite = find(c.beigin(), c.end(), target);

一般使用auto都是自己知道类型的,除过lamd。

ranged-base for

for ( dec1 : col1) {
   statement
}
for ( int i : {2,3,4,5,6,7} ) {
  cout << i << endl;
}

就会自动生成一个容易,比起以前用for和foreach简化多了。搭配auto使用:

vector<double> vec;
...
for ( auto elem : vec) {
   elem *= 3; //pass by value 容器中的值不变
}
for ( auto& elem : vec ) {
  elem *= 3; //pass by reference 可以修改容器中的内容
}

第一个相当中间变量是auto的是一个指针,第一个相当于是一个值。

reference

int x=0;
int* p = &x;  //p is a pointer to x
int& r = x;  //r is a referenece to x

引用声明的时候必须有初值,指针就可以不需要;引用不能重新赋值,指针可以;sizeof® == sizeof(x), &x == &r;虽然引用的真实实现是一个指针,但是他的大小是要和所代表的类型一样,地址也要和所代表的类型一样。
reference就是一种漂亮的pointer,多庸才参数定义处,pass by reference。传值和传引用的写法是一样的,但是传指针的写法就不一样。但是传指针和传引用比传值的速度快,都是传指针的。
如果两个函数的参数和函数名相同,只是一个是传值形式一个是传引用,是不能共存的,不认为是重载,编译器给的签名是相同的。因为调用的形式一样,编译器无法区分,ambiguity。

double imag(const double& im) {...}
double  imag(const double im) {...}

如果两个函数的声明都相同,一个有const一个没const,是可以共存的,有const两个的签名不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值