类中的特殊成员函数
Posted qlc23333
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类中的特殊成员函数相关的知识,希望对你有一定的参考价值。
为了实现类中数据成员的初始化,销毁,对象之间的复制,赋值,移动等操作,在类中设计了一些特殊成员函数
1、构造函数
1.1、作用
为类内成员函数提供初始化值,在定义对象时自动被调用
1.2、定义
class_name(T1,T2……)
例:
Point(double a,double b)x_ = a,y_ = b;//定义
Point p(1,2);//调用
1.3、初始化列表
class_name(T1,T2……): 成员1(初始值),成员2(初始值)……
例:
Point():x_(0),y_(0)
1.4、补充说明
<1>.未自定义构造函数时,编译器会为类自动生成一个构造函数,将全局编列和静态变量初始化为0
<2>.用new构建动态对像时,也调用构造函数
2、析构函数
2.1、作用
对象生存期结束后,c++自动调用析构函数删除对象分配的自由空间
2.2、定义
~class_name()
例:
~Point()
2.3、补充说明
<1>.未自定义析构函数时,编译器会为类自动生成一个析构函数
<2>.若有多个对象同时结束生存期,C++将按照定义他们相反的顺序调用析构函数
3、拷贝函数
3.1、作用
使用已存在的对象为新对象初始化,定义对象时调用
3.2 、定义
class_name(const class_name X)
例
Point(const Point& a)x_ = a.x(),y_ = a.y();//定义 Point p1(1,2),*p; Point p2(p1);//调用
3.3、补充
<1>.未自定义拷贝函数时,编译器会为类自动生成一个拷贝函数
C ++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)[重复]
【中文标题】C ++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)[重复]【英文标题】:C++ Error C2600: Cannot define a compiler-generated special member function (must be declared in the class first) [duplicate] 【发布时间】:2020-07-10 18:16:58 【问题描述】:在编译使用自定义复制构造函数的简单程序时,我收到 C2600 错误(在标题中)。
我的 .h 文件是
#pragma once
namespace uiuc
class Cube
public:
Cube();
double getVolume();
double getSurfaceArea();
void setLength(double length);
private:
double length_;
;
我的 Cube.cpp 文件是
#include "Cube.h"
#include <iostream>
namespace uiuc
Cube::Cube()
length_ = 1;
std::cout << "Default consturctor invoked" << std::endl;
Cube::Cube(const Cube& obj)
length_ = obj.length_;
std::cout << "Copy consturctor invoked" << std::endl;
double Cube::getVolume()
return length_ * length_* length_;
double Cube::getSurfaceArea()
return 6 * length_* length_;
void Cube::setLength(double length)
length_ = length;
而我的 main.cpp 文件是
#include <iostream>
#include "Cube.h"
int main()
uiuc::Cube c;
uiuc::Cube mycube = c;
return 0;
我不明白为什么会抛出这个错误。有什么建议吗?
编辑:
非常感谢您的快速回复。我是 C++ 的新手,如果这看起来微不足道,我很抱歉。
正如其他人所提到的,修复方法是将Cube(const Cube& obj);
添加到头文件中。
【问题讨论】:
将此声明添加到您的类定义中Cube(const Cube& obj);
编译器错误告诉您确切地出了什么问题,以及如何解决它。
编译器不会抛出错误,抱歉,它很快就成了我的小烦恼。
This question 和 several others 几乎相同,只是它们尝试定义默认构造函数而不在类定义中声明它。
【参考方案1】:
您没有在 .h 文件中声明构造函数。
应该是这样的:
#pragma once
namespace uiuc
class Cube
public:
Cube();
Cube(const Cube& obj); // This was missing.
double getVolume();
double getSurfaceArea();
void setLength(double length);
private:
double length_;
;
然后你应该能够在类定义之外定义它。
【讨论】:
【参考方案2】:功能:
Cube::Cube(const Cube& obj)
length_ = obj.length_;
std::cout << "Copy consturctor invoked" << std::endl;
在 cpp 文件中被声明为 Cube
的成员函数,但在您的类定义中缺少它。
它应该在这里:
class Cube
public:
Cube(const Cube& obj)
// ...
;
【讨论】:
以上是关于类中的特殊成员函数的主要内容,如果未能解决你的问题,请参考以下文章
Python_day8_面向对象(多态成员修饰符类中特殊方法对象边缘知识)异常处理之篇