`
lc52520
  • 浏览: 369256 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

C++隐式成员函数2【Z】

阅读更多

1 编译器自动生成的基本函数
C++编译器会在开发人员没有声明下列函数的时候,声明编译器自己的版本。

class Empty{}

等效于下面的声明

class Empty{
public:
Empty(); //缺省构造函数
Empty(const Empty& rhs); //拷贝构造函数
~Empty(); //析构函数
Empty & operator=(const Empty& rhs); //赋值运算符
Empty & operator&(); //取址运算符
const Empty * operator&() const;
}

下面是编译器的参考实现

inline Empty::Empty() {}
inline Empty::~Empty() {}
inline Empty* Empty::operator&() { return this; }
inline const Empty* Empty::operator&() const { return this; }

Empty::Empty(const Empty& rhs); //对类的非静态数据成员进行“以成员为单位的”逐一拷贝构造(赋值)。

2 防止拷贝和赋值
如果我们不想编写拷贝构造函数和赋值函数,又不允许别人使用编译器生成的缺省函数:
一种方法是:只需将拷贝构造函数和赋值函数声明为私有函数,不用编写代码;

class Empty{
private:
Empty(const Empty& rhs); //拷贝构造函数
Empty & operator=(const Empty& rhs); //赋值运算符
}

3 在派生类中实现类的基本函数
基类的构造函数,析构函数,赋值函数都不能被派生类继承。如果类之间存在继承关系,在编写上述基本函数时应该注意如下事项:
派生类的构造函数应在其初始化表里调用基类的构造函数。
基类与派生类的析构函数应该为虚(即加virtual关键字)。
编写派生类的赋值构造函数时,注意不要忘记对基类的数据成员重新赋值。

分享到:
评论

相关推荐

    C++初始化成员列表.

    一方面,使用初始化成员列表可以避免类成员的隐式默认构造函数的调用,避免了多余的构造和赋值操作,从而提高效率。例如,在下面的例子中,MyClass中的abc成员是ABC类的对象,而ABC类只有带参数的构造函数,没有默认...

    腾讯_-_C++编码规范.7z

    2. **注释**:规范要求每个类、函数、结构体等都有清晰的注释,解释其用途、参数和返回值。注释应保持更新,与代码同步。 3. **代码组织**:提倡模块化和封装,每个源文件只包含一个类或功能,避免大段的代码堆积。...

    用C++进行DLL编程入门

    Point1类中的所有成员函数都是导出的,而Point2类中只有一个成员函数是导出的。 在dlltest.cpp文件中,需要实现这些成员函数。注意这里使用了_declspec(dllexport)和_declspec(dllimport)关键字来控制函数的导出和...

    C++面向对象程序设计清考试卷A.doc

    构造函数是特殊的成员函数,用于初始化对象,而静态成员函数则与特定的对象实例无关,它们不属于任何特定对象。 **5. 堆对象的操作** - 创建或删除堆对象需要用到 `new` 和 `delete` 操作符(选项 B 和 C)。`new`...

    2.const对象-NULL和nullptr-C++中创建对象数组.docx

    例如,在上面的代码中,我们定义了一个名为area的类,其中包括三个成员变量x、y和z,以及三个成员函数printxy、add和go。其中,printxy函数被定义为const,意味着它不能改变类的状态。 在main函数中,我们创建了一...

    华为技术有限公司C++语言编程规范,华为技术有限公司c语言编程规范.pdf,C,C++

    2. 函数注释:每个函数前都应有简短的描述其功能、参数和返回值。 3. 行内注释:注释应当简洁,避免过多的解释,以保持代码清晰。 三、类型与变量 1. 强类型:尽可能使用强类型,减少隐式类型转换,提高代码可读性...

    C++标识符规则

    3. **函数或类的成员函数**: 如`void print() {}` 4. **自定义类型名**: 如`typedef int Integer;` 5. **标识宏的名字**: 如`#define MAX 100` 6. **宏的参数**: 如`#define ADD(x, y) (x + y)` #### 六、数据类型...

    c++基础语法:构造函数初始化列表

    分配内存,调用构造函数 时,隐式/显示的初始化各数据 成员2.进入构造函数后在构造函数中执行一般计算 使用初始化列表有两个原因: 1.必须这样做:如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个...

    习题5及其解答(第二版).doc

    这些知识点涵盖了C++中结构体和类的基本概念,包括成员访问、运算符优先级、静态成员和常量成员函数的使用,以及友元函数和`this`指针的作用。理解和掌握这些知识点对于深入学习C++编程至关重要。

    dll编程入门(C++语言).pdf

    - 当需要导出类时,我们可以在头文件中使用条件宏来控制类和成员函数的导出。例如,`DLL_API`宏可以用于标记类和函数的导出。在DLL的实现文件中,我们定义这个宏为`_declspec(dllexport)`,而在使用DLL的客户端程序...

    C++随手笔记C++随手笔记

    - 成员函数可以是普通的成员函数,也可以是静态成员函数。 - 成员函数可以重载,以提供不同的功能实现。 #### 31. 模式设计 - 桥接模式可以将抽象与实现解耦。 - 单例模式保证一个类只有一个实例,并提供全局访问点...

    C++类的初始化介绍及实现

    首先,我们来看C++中如何在构造函数的成员初始化列表中初始化类的成员。成员初始化列表是一种特殊的语法结构,允许我们在构造函数定义的括号内,以冒号(:)开头,列出成员变量和它们的初始值。这种方式比在构造函数体...

    (完整版)C++试题(一)附答案.docx

    常数据成员可以在构造函数初始化列表中初始化,且常对象只能调用常成员函数,但常数据成员并不一定是公有的。 13. **友元函数**: 友元函数可以访问类的私有和保护成员,但不是成员函数,使用`friend`关键字声明...

    C++笔试面试题

    #### 四、结构体成员函数调用错误 1. **问题描述**: - 指出了在定义结构体对象时出现的问题。 2. **代码示例**: ```cpp struct Test { Test(int) {} Test() {} void fun() {} }; void main(void) { ...

    (完整版)C++试题(一)附答案.pdf

    12. **常成员**:常数据成员可以在构造函数初始化列表中初始化,且常对象只能调用常成员函数,选项B错误。 13. **友元函数**:友元函数可以访问类的所有成员,不仅仅是私有成员,选项B错误。 14. **指针操作**:...

    c++基础语法:构造函数与析构函数

    构造函数是C++类的一个特殊成员函数,它的主要任务是在创建对象时进行初始化。当创建一个类的对象时,构造函数会被自动调用。如果类中没有定义任何构造函数,编译器会自动生成一个默认构造函数,即无参构造函数。...

    《面向对象程序设计》习题三答案.doc

    - 成员函数重载二元运算符时,参数列表中只需要一个参数,因为它隐式地接收当前对象作为第一个操作数。 - 非成员函数重载二元运算符时,参数列表中需要两个参数。 - 示例: ```cpp class MyClass { public: ...

    CC++笔试经典题目(附答案).pdf

    - C++ 中的空类默认会产生以下成员函数: - 默认构造函数 - 默认析构函数 - 复制构造函数 - 复制赋值运算符 - 移动构造函数 - 移动赋值运算符 - 这些成员函数都是由编译器自动提供的,除非用户显式定义了...

Global site tag (gtag.js) - Google Analytics