《effecttive C++》和一些其他C++开发的东西的学习总结(长期更新)
前言
话说这个真的是合法的吗,csdn有和谷歌搜索引擎和StackOverflow签署用户数据共享协议么lmfao
而且我写这篇文章过程中查资料的工作语言全程使用英文
他还贴心的翻译了一下,展现在旁边的“热度”榜上,我真的哭死
正文
本系列主要是记录面试题,以及本人感觉可以作为面试题考点的东西
为什么++a
是左值而a++
是右值,请从编译原理的文法分析的角度回答
答:首先看现象,++a是先加后返回,a++是先返回后加
也就是说对于编译器待分析的表达式a=++b
会被化简为a=b+1
而先返回后加,类似于a=b b=b+1
不能化简为一个表达式
而在不考虑常量的情况下,左值就是一个表达式或者等价于表达式的东西,b++
在上下文中无法化成一个表达式,所以他是右值
//无法编译,仅供参考
int operator ++ (int& n) // postfix increment
{
int tmp = n; //而不是int& tmp
n = n + 1;
return tmp; //此时result是右值, 这里的result就是结束,就是"不变" 不过这里的"不变"需要打引号
}
int& operator ++ (int& n)
{
n = n + 1;
return n;//此时result是引用,是"可变",这里的"可变"也是打引号的
}
请问以下写法见过吗, 这样的写法的程序变量A暴露给用户安全吗, 在不暴露的情况下这么写有什么作用
class a{
private:
int& b;
}
答:当初始化的时候
class a{
private:
int& b;
}
int _b;
a myA(_b);
这样我们在外面就可以改变里面的b
了, 至于是否安全,得看这个_b
是否会直接或者间接的被用户的不安全输入影响, 如果只是程序员这侧可以动到_b, 那么就可以免去getB
setB
这类函数的开销,直接赋值就可以, 而且还受到C++ “编译时” 的关键字保护
这在不能内联的, 频繁调用的, 情况下可以大幅减少开销,属于一种较为常见的优化, 但是需要注意程序安全
待更新, 写作业去了