我将使用一个基本类来尽我所知定义编译器的行为。
class Student sealed {
private:
std::string m_strFirstName;
std::string m_strLastName;
std::vector<unsigned short> m_vClassNumbers;
std::vector<std::string> m_vTeachers;
std::vector<unsigned short> m_vClassGrades;
public:
Student( const std::string& strFirstName, const std::string& strLastName );
std::string getFirstName() const;
std::string getLastName() const;
void setClassRoster( std::vector<unsigned short>& vClassNumbers );
std::vector<unsigned short>& getClassRoster() const;
void setClassTeachers( std::vector<std::string>& vTeachers );
std::vector<std::string>& getClassTeachers() const;
void setClassGrades( std::vector<unsigned short>& vGrades );
std::vector<unsigned short>& getGrades() const;
};
这个类的默认声明版本将会构造一个拷贝构造函数和一个等号操作符。
class Student sealed {
private:
std::string m_strFirstName;
std::string m_strLastName;
std::vector<unsigned short> m_vClassNumbers;
std::vector<std::string> m_vTeachers;
std::vector<unsigned short> m_vClassGrades;
public:
Student( const std::string& strFirstName, const std::string& strLastName );
std::string getFirstName() const;
std::string getLastName() const;
void setClassRoster( std::vector<unsigned short>& vClassNumbers );
std::vector<unsigned short>& getClassRoster() const;
void setClassTeachers( std::vector<std::string>& vTeachers );
std::vector<std::string>& getClassTeachers() const;
void setClassGrades( std::vector<unsigned short>& vGrades );
std::vector<unsigned short>& getGrades() const;
private:
Student( const Student& c );
Student& operator=( const Student& c );
};
而第二个版本的类则不会,因为我将它们都声明为私有!
这可能是我能够展示这种情况的最佳方式。我只显示了此类的头文件接口,因为 c++ 的源代码或编译成目标代码不是问题所在。这两个版本在预编译阶段的定义差异决定了编译器在开始将源代码编译成目标代码之前的工作方式。
要记住的是,标准库中的字符串和容器确实实现了它们自己的复制构造函数和赋值运算符!但是如果一个类具有 int、float、double 等基本类型,则同样的概念适用于编译器的行为。因此,编译器将根据其声明以同样的方式处理简单类。
class Foo {
private:
int m_idx;
float m_fValue;
public:
explicit Foo( float fValue );
};
第二个版本
class Foo {
private:
int m_idx;
float m_fValue;
public:
explicit Foo( float fValue );
private:
Foo( const Foo& c );
Foo& operator=( const Foo& c );
};
编译器会以同样的方式对待这个类;它不会定义其中任何一个,因为它们被声明为私有而没有被实现。