C++面试用题(二)const和Lambda表达式

const

const在C++中用来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数。

一、修饰普通类型变量

const int a =7;
int b=a;
a=8;//不被允许

最后a仍然是8,在加上了const关键字后,a就被编译器认为是一个常量,不允许修改。
如果非要改,可以在const前面再加上Volatile关键字。

	volatile const int a = 9;
	int *p = (int*)&a;
	*p = 8;
	cout << a << endl;
	
	system("pause");
	return 0;

这样a的值就变成了8,但是注意,直接给a赋值还是不可以的,会有红线。

二、修饰指针类变量
const修饰指针变量有以下三种情况:
A:const修饰指针指向的内容,内容为不可变的量。
B:修饰指针,指针为不可变的量。
C:const修饰指针和指针指向的内容,二者都为不可变的变量。

A:

int a=8;
const int* p=&a;//指针指向的内容,a的地址,不可被改变

B:

int a=8;
int* const p=&a;
*p=9;//这是允许的
int b=7;
//p=&b;这是不可以的

由于此处的const修饰的是p,而不是int* p,所以const对应不可以改变的值,不再是int* p这个指针内存放的内容,所以不可以改变的是地址。

C:都修饰

int a=8;
const int * const  p = &a;

这个时候无论是*p还是p,都无法做任何更改喽。

三、const参数传递和函数返回值
const修饰函数参数也可以分为三种情况:

A:const修饰传入参数:

int test(const int a)
{
	//a++;
}

这种情况一般不需要用const修饰,因为如果不是以引用传递,函数会自动产生临时变量复制实参的值。换句话说,只有传入参数是引用的情况下,

B:const修饰指针参数,防止指针被篡改:

int test(int* const a)
{
	int p = 9;
	*a = p;
	//a = &p;不被允许
}

C:声明类的成员函数为const。

void test()const{cout<<"test"<<endl;}

const类型的函数表明该函数不会修改对象的成员,同时该函数也不可以调用非const函数。例如:

string name="chujialu";
string setname(string& name){name="huyu";return name;}
void test()
{
string another_name="huyu";
name="huyu";//不允许
setname(another_name);//不允许,can't call a non-const function
}

Lambda表达式/匿名函数

当写一个只会被使用一次的函数时,会用到匿名函数。
定义格式:
[捕获列表](参数列表·)->返回值类型{函数主体}
调用:在定义之后直接调用:

int c=[](int a,int b)->int{return a+b;}
(1,2);//最后一个括号是参数列表
等价于
int add(int a,int b){return a+b;}
int c=add(a,b);

那如果我不想立刻使用这个函数,而是保存一下以后再用呢?

auto f=[](int a,int b)->int{return a+b;};
int c=f(1,2);

两个lambda表达式的嵌套

	int c=[](int n)
	{
		return [n](int x) {
			return n + x;
		}(1);
	}(2);

可以实现和上述相同的效果。函数嵌套函数,就称之为函数式编程。有什么好处呢?
在多线程,并发的环境中适用,因为它只依赖于内部。
进阶可以参考:
https://blog.nowcoder.net/n/23157c8ac30b4d479088bab2bd3c9e7d
这里贴出部分回答:
[]:表示不捕获任何外部变量
[=]:以传值的方式捕获外部的所有变量
[&]:以传引用的方式捕获外部的所有变量
[this]:捕获外部的this指针
[=,&a]:以传值的方式捕获外部的所有变量,但是a变量以传引用的方式捕获
[a,b]:以传值的方式捕获外部变量a和b
[a,&b]:a以传值方式捕获,b以传引用的方式捕获

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值