拷贝构造函数里为什么能引用到另一个对象的私有变量#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Person {
public:
Person(string name, int age) : m_name(name), m_age(age) {
cout << "Constructing " << m_name << endl;
}
~Person() {
cout << "Destructing " << m_name << endl;
}
Person(const Person& p) : m_name(p.m_name), m_age(p.m_age) {
cout << "Copy constructing " << m_name << endl;
// m_name = p.m_name;
// m_age = p.m_age;
}
string to_string() const {
return "Person: " + m_name;
}
private:
string m_name;
int m_age;
};
拷贝构造函数里引用到另一个对象的私有变量是因为拷贝构造函数是在同一个类内部定义的,因此可以访问该类的私有成员。即使是另一个对象的私有成员,在同一个类内部也是可以被访问的。
c++ 中右值和左值的含义
在 C++ 中,左值(lvalue)和右值(rvalue)是表达式的两个基本概念,它们可以用来描述变量或表达式的属性。
左值(lvalue)指的是一个表达式所代表的内存位置,即具有“地址”的表达式。例如,变量、数组元素、结构体成员、指针等都是左值。左值可以出现在赋值语句的左侧和右侧,可以取地址,可以被引用、修改等操作。
右值(rvalue)指的是一个表达式所代表的数值,即不具有“地址”的表达式。例如,常量、字面量、函数返回值等都是右值。右值只能出现在赋值语句的右侧,不能被引用或修改,也不能取地址。
在 C++11 中,加入了右值引用(rvalue reference)的概念,即可以将右值绑定到一个特殊的引用类型上,从而实现移动语义和完美转发等高级特性。
push_back 与 emplace_back 的使用场景
push_back 和 emplace_back 都是向容器末尾添加元素的函数,它们的使用场景略有不同。
push_back 函数接受一个参数,可以将该参数拷贝或移动到容器末尾。如果参数是一个左值,则会进行拷贝操作;如果参数是一个右值,则会进行移动操作。因此,push_back 适用于拷贝或移动已有的对象到容器中。
emplace_back 函数接受任意数量的参数,可以直接在容器末尾构造一个新的元素。它使用这些参数构造一个新的对象,并将该对象移动到容器中。因此,emplace_back 适用于在容器中直接构造新的对象。
总的来说,如果你已经有一个对象,并且想将其添加到容器中,可以使用 push_back;如果你需要直接在容器中构造一个新的对象,则可以使用 emplace_back。使用 emplace_back 可以避免拷贝和移动的开销,提高程序的效率。