1. C++中值传递和引用传递的区别
1) 值传递: 在函数调用时,会触发一次参数的拷贝动作,所以对参数的修改不会影响原始的值。如果是较大的对象,复制整个对象,效率较低。
2) 引用传递: 函数调用时,函数接收的就是参数的引用,不会触发参数的拷贝动作,效率较高,但对参数的修改会直接作用于原始的值。
2. C 和 C++ 的区别
可以考虑从以下几个方面回答:
1) 面向对象还是面向过程:
- C语言是一门面向过程的语言,侧重于通过过程 (函数) 来解决问题。
- C++是一门多范式语言,主要支持面向对象,侧重于使用类和对象来组织代码。
2) 继承:
- C++支持继承,允许一个子类继承一个或多个父类,达到代码复用的目的。
- C语言中没有继承的概念。
3) 函数重载:
- C++支持函数通过参数类型和参数个数的重载。
- C语言不支持重载,函数名必须唯一才行。
4) 模板:
- C++支持模板,支持静态和动态形式的多态。
- C语言对此都不支持。
5) 内存管理:
- C++使用 new 和 delete 操作符来管理内存,也支持使用智能指针来动态管理内存。
- C语言需要使用 malloc 和 free 来申请和释放内存。
6) 标准库:
- C++的 STL 标准库能力比 C 语言丰富的多,比如 vector、string、list、map 等等,还有很多算法相关的能力,这些 C 语言都没有。
3. 什么是 C++ 的左值和右值?有什么区别?
什么是左值?什么是右值?
- 左值:可以出现在赋值运算符的左边,并且可以被取地址,通常是有名字的变量。
- 右值:不能出现在赋值运算符的左边,不可以被取地址,表示一个具体的数据值,通常是常量、临时变量。
一般可以从两个方向区分左值和右值。
方向 1:
- 左值:可以放到等号左边的东西叫左值。
- 右值:不可以放到等号左边的东西就叫右值。
方向 2:
- 左值:可以取地址并且有名字的东西就是左值。
- 右值:不能取地址的没有名字的东西就是右值。
示例:
int a = b + c;
a是左值,有变量名,可以取地址,也可以放到等号左边,表达式 b+c 的返回值是右值,没有名字且不能取地址,&(b+c)不能通过编译,而且也不能放到等号左边。
int a = 4; // a是左值,4作为普通字面量是右值
4. 什么是 C++ 的移动语义和完美转发
移动语义
一种优化资源管理的机制。常规的资源管理是拷贝别人的资源。而移动语义是转移所有权,转移了资源而不是拷贝资源,性能会更好。
移动语义通常用于那些比较大的对象,搭配移动构造函数或移动赋值运算符来使用。
{
:
( size) : (size) { data_ = [size]; }
() {}
( A& a) { size_ = a.size_; data_ = [size_]; cout << << endl; }
(A&& a) { ->data_ = a.data_; a.data_ = ; cout << << endl; }
~() { (data_ != ) { [] data_; } }
*data_;
size_;
};
{
;
A b = a;
A c = std::(a);
;
}


