`
kmplayer
  • 浏览: 508994 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

条款45:C++(编译器)默默为我们完成和调用哪些函数

阅读更多
1,一个空的class何时不为空?
当C++编译器处理过它们之后.
2,如果你这么写:
class Empty{};
其意义相当于:
class Empty
{
public:
Empty();
Empty(const Empty& rhs);
~Empty();

Empty& operator=(cosnt Empty& rhs);
Emtpy* opertor&();
const Empty* operator&() const;
};

3,需要注意的是:
只有当这些函数被需要时,编译器才会定义它们.
如:
const Empty e1;                     // default constructor;
                                    // destructor
Empty e2(e1);                       // copy constructor
e2 = e1;                            // assignment operator
Empty *pe2 = &e2;                   // address-of
                                    // operator (non-const)
const Empty *pe1 = &e1;             // address-of
                                    // operator (const)
注意:产生出来的destructor并非虚拟函数,除非这个class继承自一个base class,而该base class拥有一个virtual destructor.
这些函数实际被定义成这样:
inline Empty::Emtpy(){}
inline Empty::~Emtpy(){}
inline Empty* Empty::operator&(){ return this; }
inline const Empty* Empty::operator&() const { return this; }

4,对于copy constructor或assignment运算符,官方规则是:
缺省的copy constructor(或assignment)对class的nonstatic data members执行memberwise copy constructor.
如果m是class C中的一个型别T的nonstatic data member,而c没有声明copy constructor或assignment,那么就调用T的copy constructor或assignment,知道遇到一个copy constructor或assignment或是遇上内建型别(如int,double).
缺省情况下,内建型别以bitwise copy方式进行copy constructor或assignment.

5,考虑下面的例子:
#include<iostream>
using namespace std;

template<class T>
class NamedObject
{
public:
    NamedObject(string& name, const T& value):nameValue(name),objectValue(value){};
private:
    string& nameValue;
    const T objectValue;
};


int main()
{
    string newDog("Persephone");
    string oldDog("Satch");
    NamedObject<int> p(newDog, 2);
    NamedObject<int> s(oldDog, 29);
    p = s;
    return 0;
}

p中的data members将如何变动?
C++决定拒绝这份代码.
编译错误:
error: non-static reference member  can't use default assignment operator|
error: non-static const member  can't use default assignment operator|

再次引出:如果你打算让一个内含"reference member"或"const member"的class支持assignment动作,你必须自己定义assginment运算符.
分享到:
评论

相关推荐

    迷你型C++编译器和函数编译手册

    《迷你型C++编译器和函数编译手册》是一个小巧而实用的工具,它集成了C++编程语言的编译环境以及一个便捷的函数速查手册。对于初学者和经验丰富的开发者来说,这都是一个不可多得的资源。下面我们将深入探讨C++...

    c++编译器简介

    希望本文能够帮助读者更好地理解和使用C++编译器,为日后的软件开发打下坚实的基础。 通过本文的学习,读者应该能够掌握C++编译器的基本概念、工作流程以及如何根据具体需求选择合适的编译器。此外,还介绍了几种...

    对C++编译器区分重载函数无任何意义的信息是 A.参数类型B.参数个数.docx

    根据题目给出的选项A(参数类型)和选项B(参数个数),我们需要确定哪一项对于C++编译器区分重载函数来说是无意义的。 #### 选项A:参数类型 参数类型对于区分重载函数至关重要。不同的参数类型可以使得C++编译器...

    c调用C++函数

    在编程世界里,C语言和C++是两种广泛使用的编程语言,它们各有特色,但有时候我们需要在C语言的代码中调用C++编写的函数,特别是在大型项目中,可能既有历史遗留的C代码,又有使用C++新开发的部分。本文将深入探讨...

    C++调用C函数实例详解

    C++调用其它语言的函数,由于编译器生成函数的机制不一样,所以需要经过特殊处理,才可以调用。调用C语言的函数,需要在函数声明的地方语句extern “C”。如果不使用该语句,在链接的时候,编译器就会报以下这种错误...

    python调用C++函数

    - **编译和链接**:C++代码需要编译为动态链接库,然后Python才能调用其中的函数。这通常涉及到设置正确的编译器选项和链接器参数。 在实际应用中,选择哪种方法取决于项目的需求、团队的技能以及对性能的追求。...

    C调用REFPROP,c调用c++函数,C,C++

    这通常涉及到使用C语言的函数指针或者C++的extern "C"语法,以确保C++编译器不会对函数进行名字修饰,保持与C语言的兼容性。 在压缩包子文件的文件列表中,我们看到两个文件:Main.cpp和RefpropConstant.h。Main....

    在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?.docx

    在C++程序中,调用C编译器编译后的函数需要加extern "C",这是因为C++编译器和C编译器对函数的命名方式不同。C++编译器会对函数名进行名称 mangling,以便支持函数重载和运算符重载,而C编译器则不会。 名称 ...

    MinGW-w64 C/C++ 编译器

    为了在MATLAB中使用MEX功能,你需要一个兼容的C/C++编译器,如Microsoft Visual Studio或MinGW-w64。当系统中没有安装这些编译器时,`mex -setup`会失败。 TDM64-GCC(Tiny Distro MinGW-w64 for x86_64)是MinGW-w...

    matlab c++编译器的设置

    ### MATLAB C++ 编译器设置详解 #### 一、问题背景 在使用MATLAB进行C++编译器设置的过程中,可能会遇到一个错误提示:“Undefined ...通过上述步骤,可以顺利完成MATLAB C++编译器的设置,并避免出现相关错误。

    C#和c++dll函数相互调用

    - 使用C++编译器(如Visual Studio)创建一个动态链接库项目。 - 在C++代码中,使用`extern "C"`关键字确保函数名不会被C++的名称修饰(即名称混淆)。 - 定义需要导出的函数,并使用`__declspec(dllexport)`来...

    Matlab安装MinGW-w64 C/C++ 编译器

    在使用Matlab进行C或C++编程时,有时需要编译和链接外部代码,这就需要一个合适的C/C++编译器。MinGW-w64是一个轻量级的、开源的Windows上的GCC(GNU Compiler Collection)移植版,它为32位和64位的Windows系统提供...

    关于C和C++中函数的调用约定.doc

    - 明确声明函数的调用约定,如使用`extern "C"`来告诉C++编译器使用C风格的调用约定和名称修饰。 - 在头文件中正确地声明和定义函数,确保参数类型和调用约定一致。 - 对于库函数,了解其编译和链接的约定,确保与...

    MinGW-w64 C/C++编译器+libsvm安装包.rar

    MinGW-w64是GCC(GNU Compiler Collection)在Windows平台上的一个移植版本,它为64位和32位的Windows系统提供了原生的编译环境。这个编译器套件包括了C、C++、Fortran等语言的编译器,支持多种编程语言的开发。...

    c++中子类对象不能调用父类中的虚函数

    然而,这里有一个陷阱:如果通过子类对象直接调用父类的虚函数,编译器会认为是在调用子类自身的实现,即使子类没有覆盖这个虚函数。这就是“子类对象不能调用父类中的虚函数”的含义。例如,假设我们有以下代码: ...

    剖析C++函数调用约定

    在Visual C/C++编译器中,有四种主要的函数调用约定:__cdecl、__stdcall、__fastcall和thiscall。了解这些约定的差异对于编写高效且兼容的代码至关重要。 首先,__cdecl是C和C++的默认调用约定。在这种约定中,...

    Effective.C++.中文第二版.50条款doc文档.chm

    条款45: 弄清C++在幕后为你所写、所调用的函数 条款46: 宁可编译和链接时出错,也不要运行时出错 条款47: 确保非局部静态对象在使用前被初始化 条款48: 重视编译器警告 条款49: 熟悉标准库 条款50: 提高对C++的认识

    c++编译器 mingw64位 gcc资源下载

    用户可以通过运行这个安装程序来安装所需的库和工具,包括C++编译器。 `gcc-*`系列的tar.gz文件,如`gcc-java-3.4.5-20060117-3.tar.gz`,代表了特定语言的GCC子组件。例如,`gcc-java`是用于Java语言的前端,而`...

    编译器 c++版

    C++编译器是将高级C++语言代码转化为机器可执行代码的关键工具,它是程序员与计算机硬件之间的桥梁。本文将深入探讨C++编译器的工作原理、重要性以及如何使用。 首先,我们要理解什么是编译器。编译器是一种特殊的...

    js调用c++函数,c++调用js函数(非mfc)

    Emscripten是一个LLVM到JavaScript的编译器,它可以将C++代码编译为Web浏览器可执行的JavaScript。通过Emscripten,你可以创建一个C++库,然后在JavaScript中使用`Module.ccall`或`Module.fcall`来调用这个库中的...

Global site tag (gtag.js) - Google Analytics