0%

面经C++类和数据抽象

经C++类和数据抽象

C++中类成员的访问权限

C++ 通过 pubilc, protected, private 三个关键字来控制成员的访问权限。

  • 在类的内部,可以随意访问三种属性的变量
  • 在派生类中,不可以访问父类 私有的 成员
  • 在类的外部,只能通过对象访问成员,并且只能访问public 属性的成员

C++中 struct 和class的区别

  • c++ 可以用 struct 和 class 定义类,都可以用来继承,但是 struct 默认是公开的属性,而class默认成员是私有的类型。
  • class 这个关键字还可以使用 模板,模板类 而 struct 不能

C++类内可以定义引用数据成员吗

可以,必须通过成员函数初始化列表初始化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

class Ref
{
public:
// 构造函数形参为传值,不能保证正确性
// Ref (int target) :myref(target) {
// cout << "Ref constructor" << endl;
// }

// 函数体对引用赋值,编译错误:引用未初始化
// Ref (int &target) {
// myref = target;
// cout << "Ref constructor" << endl;
// }

// 如果成员为变量为引用类型,那么构造函数的参数为引用类型 这个好理解 因为你都是引用外界的数据,如果用值传递,进来的只是个临时值,再对临时值做引用,显然有问题。
// 引用必须在成员初始化列表里面初始化,不能在函数体里面初始化。构造函数的参数列表在构造函数之前执行
// 在函数体里面修改myref,相当于赋值,显然引用不能赋值
Ref (int &target) :myref(target) {
cout << "Ref constructor" << endl;
}

void printRef() {
cout << "myref is: " << myref << endl;
}

virtual ~Ref () {}

private:
int &myref;
/* data */
};

右值引用,跟左值有什么区别

左值:指可以取地址的,或者有具体名字的变量/对象

  • 左值可以被赋值,寻址,可变

右值:c98中包含纯右值,即临时值,和将亡值,通过右值引用绑定的右值,一般右值都是临时的,表达式结束右值便不再存在(右值引用可以延续右值的生命周期)

  • 右值不可变,不可寻址

能将 左值绑定到左值引用上,右值能绑定到右值引用以及const 类型的左值引用上。右值引用的主要目的是提高右值的声明周期,绑定到右值引用上的右值相当于有了新的名字,接管了临时值的内存,成为了左值,便不会再被释放。右值引用的主要应用有 语义移动和完美转发。通过语义移动功能可以将左值转换为右值,如果直接传递左值,中间会多出临时变量的拷贝构造过程,使用右值可以避免这个开销。完美转发就是 输入函数的是左值/右值,经过他转发后还是左值/右值,主要是函数嵌套调用的时候,如果传入第一个函数的是个右值,经过右值引用之后实际他就变成了左值。

右值引用是c11的新特性,它主要有两个方面的优势:

  1. 右值引用可以减少拷贝构造或者赋值构造中 对临时变量的 重复拷贝。
  2. 能够更简洁明确的定义泛函数
  3. 完美转发 和 语义移动

语义移动 实现原理 static_cast 强转为 右值引用 完美转发 实现原理 模板 + 引用折叠的原理共同决定 static_cast 的是强转为 右值引用还是左值引用 如果输入的是右值