c++常见问题 3

什么是左值与右值,拷贝构造函数中的引用与const为什么不能去掉?

左值(lvalue) 表示了一个占据内存中某个可被识别的位置(也就是一个地址),所以左值可以是变量也可以是指向特定内存得治的指针解引用的结果
右值(rvalue) 是一个不表示内存中的某个可识别位置对象的表达式。

不能去掉,如果去掉const会存在非const左值绑定到右值上。如果我们试图将一个非const左值绑定到右值上,会导致编译错误,因为这违反了C++中的规则。

this指针是什么? 有什么作用呢?

在C++中,this是一个指向当前对象的指针。它是一个隐式参数,可以在成员函数中使用,用于区分成员变量和局部变量的命名冲突。

当调用一个类的成员函数时,编译器会将该成员函数的调用视为传递了一个指向该对象的指针作为参数,即this指针。通过this指针,我们可以访问对象的成员变量和成员函数。this指针是所有成员函数的隐含参数,它存在与非静态成员函数中,指向被调用函数的所在对象

必须在构造函数初始化列表中初始化有哪几种情况?

在C++中,必须在构造函数初始化列表中初始化以下几种情况:

  1. 常量成员变量

如果一个类有常量成员变量,它们必须在构造函数初始化列表中进行初始化。类似于其他常量,一旦被初始化,常量成员变量的值就不能被改变。

例如:

class MyClass {
public:
    MyClass(int a) : myConst(a) {} // 初始化列表中初始化常量成员变量
private:
    const int myConst;
};
  1. 引用类型成员变量

引用类型成员变量也必须在构造函数初始化列表中进行初始化。引用一旦绑定到了某个对象上,就不能再重新绑定到另一个对象上了。因此,在构造函数中初始化引用类型成员变量非常重要。

例如:

class MyClass {
public:
    MyClass(int& a) : myRef(a) {} // 初始化列表中初始化引用类型成员变量
private:
    int& myRef;
};
  1. 没有默认构造函数的类类型成员变量

如果一个类类型成员变量没有默认构造函数,则必须在构造函数初始化列表中进行初始化。否则,编译器会报错。

例如:

class MyClass2 {
public:
    MyClass2(int a) {}
};

class MyClass {
public:
    MyClass(MyClass2 obj) : myObj(obj) {} // 初始化列表中初始化没有默认构造函数的类类型成员变量
private:
    MyClass2 myObj;
};

在上述代码中,MyClass2类没有默认构造函数,因此在MyClass类的构造函数初始化列表中必须对它进行初始化。

静态数据成员的初始化在哪里,需要注意什么?

因为静态数据成员不属于类的任何一个对象,所以他们并不是在创建类对象时被定义的,所以意味着他们不是由类的构造函数初始化的。

不能再类的内部初始化静态数据成员,必须再类的外部定义和初始化静态数据成员,且不再包含static关键字

三/五法则(Rule of Three/Five)。

如果一个类需要显式定义某一个特殊成员函数(析构函数、拷贝构造函数或赋值运算符函数),那么它很可能也需要定义其他两个特殊成员函数来管理资源和确保正确的行为。另外两个特殊成员函数分别是移动构造函数和移动赋值运算符函数,它们在C++11中引入。

因此,如果你需要手动编写析构函数、拷贝构造函数或赋值运算符函数,则应该考虑是否需要实现所有五个特殊成员函数,以确保正确性和安全性。在编写代码时,要牢记三/五法则原则,以避免潜在的问题和错误。

你可能感兴趣的:(c++,c++,开发语言,java)