数量不定的模板参数、auto、for的新形式、reference

1、variadic template(c++11)

void print(){

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

print(7.5,"hello",bitset<16>(377),42);
...在这里表示一个pack(包),这里的代码就是打印出输入的参数,最后参数为0的时候,为了防止程序错误,给出一个空参数的print。

如果想知道这一个包有几个,可以使用sizeof...(args);

2、auto

auto根据其后面的变量返回值编译器来确定类型,为了方便程序员使用。但是不要过于依赖这个关键词,我们要能够写出其真正的类型。



3、for的新形式

for( decl:coll){
    statement;
}
decl是一个变量,coll表示容器,编译器从coll这个容器里抓出变量赋值给decl。
c++11增加了这一种形式。

在以前可以使用foreach来遍历容器,可以使用迭代器来遍历容器。现在增加了这一种新的方式。

for(int i :{2,3,5,7,9,11,13,15,17})
{
    cout << i << endl;
}
这里是pass by value,如果在里面修改i的大小,也不会改变原来容器里变量的大小。

如果需要修改的话,需要pass by reference。


reference,其实内部就是由指针实现的。只是表现的形式不同。

4、reference

(a)从内存的角度去看reference


使用reference,直接读这个r的时候,编译器会制造一种假象就是,r就是x在每一次去调用r的时候,会直接近似的用x来代替,一旦确定引用,也就是代表的东西以后,是无法再次修改其代表的变量的。虽然reference底层是用point实现的,但是呈现在我们眼前的是不一样的,point这个内存单元里面的值是x的地址,而我们直接去读reference内存单元里面的值,编译器会直接给我们一个其代表的对象。

一个测试程序来表现这个现象。

typedef struct Stag{	int a,b,c,d;  }S;
int main(){
	double x = 0;
	double* p = &x; //P指向x,p的值现在是x的地址
	double& r = x;  //r代表x,现在r,x都是0

	cout << sizeof(x) << endl;  //8
	cout << sizeof(p) << endl;  //4  32位电脑下
	cout << sizeof(r) << endl;  //8
	cout <<  p << endl;         //0065FDFC
	cout << *p << endl;         //0
	cout <<  x << endl;         //0
	cout <<  r << endl;         //0
	cout << &x << endl;         //0065FDFC
	cout << &r << endl;         //0065FDFC


	S s;
	S& rs = s;
	cout << sizeof(s)  << endl; //16
	cout << sizeof(rs) << endl; //16
	cout <<  &s << endl;        //0065FDE8
	cout << &rs << endl;        //0065FDE8
}
但是我们在写代码的时候很少这样用去代表一个变量。

(b)reference的常见用途

我们一般用在参数传递上,主要还是为了让reference更像传递进来了一个对象,而不是一个指针,在写法上,其底层是表示一个指针。

如下面的方式:

void func1(Cls* pobj) { pobj->xxx();}
void func2(Cls  obj ) { obj.xxx();}
void func3(Cls& obj ) { obj.xxx();}//被调用端接口相同
....
Cls obj;
func1(&obbj);//传入接口不一样
func2(obj);
func3(obj);// 调用端接口相同
所以reference简化了传递参数的速度,同时保留了原来的写法。

reference通常被用来传递参数或者返回类型的描述。
(c) 函数签名

如果是2个相同的函数(签名),如果一个使用reference,一个是直接传对象。不能同时存在,编译器无法知道你想调用谁,有歧义(Ambiguity)。

函数签名就是除去返回类型剩下来的部分,const也是其中一部分。如果2个函数完全一样,一个有const一个没有,可以同时并存,一个const的对象调用时,会去调用const函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值