构造函数的作用c(c++类中,默认构造函数究竟有什么作用为何声明对象后就要自动调用它这有何意义)

:暂无数据 2026-04-12 10:40:02 0
想知道那些精通构造函数的作用c的人,是如何看待c++类中,默认构造函数究竟有什么作用为何声明对象后就要自动调用它这有何意义的吗?本篇将为你揭秘他们的思考路径。

本文目录

c++类中,默认构造函数究竟有什么作用为何声明对象后就要自动调用它这有何意义

构造函数是在创建给定类型的对象时执行的类方法。构造函数具有与类相同的名称,它通常初始化新对象的数据成员。
在下面的示例中,定义了一个具有一个简单的构造函数,名为 Taxi 的类。然后使用 new 运算符来实例化该类。在为新对象分配内存之后,new 运算符立即调用 Taxi 构造函数。
public class Taxi
{
public bool isInitialized;
public Taxi() //构造函数 与类同名,可重载
{
//在类被实例化的时候自动调用 一般用于初始化 类的一些属性
isInitialized = true;
}
}
class TestTaxi
{
static void Main()
{
Taxi t = new Taxi(); //这时会自动运行Taxi类的构造函数Taxi()
System.C***ole.WriteLine(t.isInitialized);
}
}
不带参数的构造函数称为“默认构造函数”。无论何时,只要使用 new 运算符实例化对象,并且不为 new 提供任何参数,就会调用默认构造函数。

c++什么叫构造函数,它的作用是什么

c++类的构造函数详解
一、 构造函数是干什么的
class Counter
{
public:
// 类Counter的构造函数
// 特点:以类名作为函数名,无返回类型
Counter()
{
m_value = 0;
}
private:
// 数据成员
int m_value;
}
该类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数-》由构造函数完成成员的初始化工作
eg: Counter c1;
编译系统为对象c1的每个数据成员(m_value)分配内存空间,并调用构造函数Counter( )自动地初始化对象c1的m_value值设置为0
故:
构造函数的作用:初始化对象的数据成员。
二、 构造函数的种类
class Complex
{
private :
double m_real;
double m_imag;
public:
// 无参数构造函数
// 如果创建一个类你没有写任何构造函数,则系统会自动生成默认的无参构造函数,函数为空,什么都不做
// 只要你写了一个下面的某一种构造函数,系统就不会再自动生成这样一个默认的构造函数,如果希望有一个这样的无参构造函数,则需要自己显示地写出来
Complex(void)
{
m_real = 0.0;
m_imag = 0.0;
}
// 一般构造函数(也称重载构造函数)
// 一般构造函数可以有各种参数形式,一个类可以有多个一般构造函数,前提是参数的个数或者类型不同(基于c++的重载函数原理)
// 例如:你还可以写一个 Complex( int num)的构造函数出来
// 创建对象时根据传入的参数不同调用不同的构造函数
Complex(double real, double imag)
{
m_real = real;
m_imag = imag;
}

// 复制构造函数(也称为拷贝构造函数)
// 复制构造函数参数为类对象本身的引用,用于根据一个已存在的对象复制出一个新的该类的对象,一般在函数中会将已存在对象的数据成员的值复制一份到新创建的对象中
// 若没有显示的写复制构造函数,则系统会默认创建一个复制构造函数,但当类中有指针成员时,由系统默认创建该复制构造函数会存在风险,具体原因请查询 有关 “浅拷贝” 、“深拷贝”的文章论述
Complex(c***t Complex & c)
{
// 将对象c中的数据成员值复制过来
m_real = c.m_real;
m_img = c.m_img;
}

// 类型转换构造函数,根据一个指定的类型的对象创建一个本类的对象
// 例如:下面将根据一个double类型的对象创建了一个Complex对象
Complex::Complex(double r)
{
m_real = r;
m_imag = 0.0;
}
// 等号运算符重载
// 注意,这个类似复制构造函数,将=右边的本类对象的值复制给等号左边的对象,它不属于构造函数,等号左右两边的对象必须已经被创建
// 若没有显示的写=运算符重载,则系统也会创建一个默认的=运算符重载,只做一些基本的拷贝工作
Complex &operator=( c***t Complex &rhs )
{
// 首先检测等号右边的是否就是左边的对象本,若是本对象本身,则直接返回
if ( this == &rhs )
{
return *this;
}

// 复制等号右边的成员到左边的对象中
this-》m_real = rhs.m_real;
this-》m_imag = rhs.m_imag;

// 把等号左边的对象再次传出
// 目的是为了支持连等 eg: a=b=c 系统首先运行 b=c
// 然后运行 a= ( b=c的返回值,这里应该是复制c值后的b对象)
return *this;
}
};
下面使用上面定义的类对象来说明各个构造函数的用法:
void main()
{
// 调用了无参构造函数,数据成员初值被赋为0.0
Complex c1,c2;
// 调用一般构造函数,数据成员初值被赋为指定值
Complex c3(1.0,2.5);
// 也可以使用下面的形式
Complex c3 = Complex(1.0,2.5);
// 把c3的数据成员的值赋值给c1
// 由于c1已经事先被创建,故此处不会调用任何构造函数
// 只会调用 = 号运算符重载函数
c1 = c3;
// 调用类型转换构造函数
// 系统首先调用类型转换构造函数,将5.2创建为一个本类的临时对象,然后调用等号运算符重载,将该临时对象赋值给c1
c2 = 5.2;
// 调用拷贝构造函数( 有下面两种调用方式)
Complex c5(c2);
Complex c4 = c2; // 注意和 = 运算符重载区分,这里等号左边的对象不是事先已经创建,故需要调用拷贝构造函数,参数为c2

}
三、思考与测验
1. 仔细观察复制构造函数
Complex(c***t Complex & c)
{
// 将对象c中的数据成员值复制过来
m_real = c.m_real;
m_img = c.m_img;
}
为什么函数中可以直接访问对象c的私有成员?
2. 挑战题,了解引用与传值的区别
Complex test1(c***t Complex& c)
{
return c;
}
Complex test2(c***t Complex c)
{
return c;
}
Complex test3()
{
static Complex c(1.0,5.0);
return c;
}
Complex& test4()
{
static Complex c(1.0,5.0);
return c;
}
void main()
{
Complex a,b;
// 下面函数执行过程中各会调用几次构造函数,调用的是什么构造函数?

test1(a);
test2(a);

b = test3();
b = test4();
test2(1.2);
// 下面这条语句会出错吗?
test1(1.2); //test1( Complex(1.2 )) 呢?
}
四、附录(浅拷贝与深拷贝
上面提到,如果没有自定义复制构造函数,则系统会创建默认的复制构造函数,但系统创建的默认复制构造函数只会执行“浅拷贝”,即将被拷贝对象的数据成员的 值一一赋值给新创建的对象,若该类的数据成员中有指针成员,则会使得新的对象的指针所指向的地址与被拷贝对象的指针所指向的地址相同,delete该指针 时则会导致两次重复delete而出错。下面是示例:
【浅拷贝与深拷贝】
#include 《iostream.h》
#include 《string.h》
class Person
{
public :
// 构造函数
Person(char * pN)
{
cout 《《 "一般构造函数被调用 !\n";
m_pName = new char;
//在堆中开辟一个内存块存放pN所指的字符串
if(m_pName != NULL)
{
//如果m_pName不是空指针,则把形参指针pN所指的字符串复制给它
strcpy(m_pName ,pN);
}
}
// 系统创建的默认复制构造函数,只做位模式拷贝
Person(Person & p)
{
//使两个字符串指针指向同一地址位置
m_pName = p.m_pName;
}
~Person( )
{
delete m_pName;
}
private :
char * m_pName;
};
void main( )
{
Person man("lujun");
Person woman(man);
// 结果导致 man 和 woman 的指针都指向了同一个地址
// 函数结束析构时
// 同一个地址被delete两次
}
// 下面自己设计复制构造函数,实现“深拷贝”,即不让指针指向同一地址,而是重新申请一块内存给新的对象的指针数据成员
Person(Person & chs);
{
// 用运算符new为新对象的指针数据成员分配空间
m_pName=new char;
if(m_pName)
{
// 复制内容
strcpy(m_pName ,chs.m_pName);
}
// 则新创建的对象的m_pName与原对象chs的m_pName不再指向同一地址了
}

构造函数在c++中有什么作用

构造函数是一种特殊的方法,主要用来在创建对象时初始化对象,即为对象成员变量赋初始值。
举个例子:
#include 《iostream》
using namespace std;
class time
{
public:
time() //c***tructor.构造函数
  {
   hour=0;
   minute=0;
   sec=0;
  }
  void set_time();
  void show_time();
  private:
  int hour;
  int minute;
  int sec;
};
  int main()
  {
   class time t1;
   t1.show_time();
   t1.set_time();
   t1.show_time();
   return 0;
  }
  void time::set_time()
  {
   cin 》》hour;
   cin 》》minute;
   cin 》》sec;
  }
  void time::show_time()
  {
cout《《hour《《":"《《minute《《":"《《sec《《endl;
  }
程序运行情况:
  0:0:0
  10 11 11 回车
  10:11:11
  任何时候,只要创建类或结构,就会调用它的构造函数。类或结构可能有多个接受不同参数的构造函数。构造函数使得程序员可设置默认值、限制实例化以及编写灵活且便于阅读的代码。

构造函数作用是什么

构造函数的作用是在创建对象时进行初始化工作,最常见的就是对成员变量赋值。构造函数是一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户调用,而是在创建对象时自动执行。

构造函数的作用就是用来实例化的,打个比方:就是将画在图纸上的高楼模型变成真实的建筑。在这个例子中this指的就是point。它用来区分是point的x还是传进来的x(也就是括号里的x)。

拓展资料:

构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。

c语言中的构造函数和析构函数的异同点

构造函数是一种用于创建对象的特殊函数,当创建对象是,系统自动调用构造函数,不能在程序中直接调用.
构造函数名与类名相同,一个类可以拥有多个构造函数(重载),构造函数可以有任意类型的参数,但不能具有返回类型!
构造函数的作用是:为对象分配空间;对数据成员赋初值;请求起他资源.
析构函数作用是清除对象,释放内存等

希望这篇关于构造函数的作用c的解读,特别是对c++类中,默认构造函数究竟有什么作用为何声明对象后就要自动调用它这有何意义的聚焦,能让你有所顿悟,而不仅仅是信息堆积。
本文编辑:admin

本文相关文章:


默认构造函数(默认构造函数有什么用)

默认构造函数(默认构造函数有什么用)

关注本号的朋友都知道,我们一直在持续输出关于默认构造函数的干货。今天,我们就聚焦到大家反复问到的默认构造函数有什么用上。

2026年3月27日 01:00

stl vector用法(C++中STL的vector容器的析构函数怎么用)

stl vector用法(C++中STL的vector容器的析构函数怎么用)

想知道那些精通stl vector用法的人,是如何看待C++中STL的vector容器的析构函数怎么用的吗?本篇将为你揭秘他们的思考路径。

2026年4月12日 08:20

column函数的使用(Excel中column函数的使用方法是什么)

column函数的使用(Excel中column函数的使用方法是什么)

从我第一次听说column函数的使用到真正弄懂Excel中column函数的使用方法是什么,也走过一些弯路。下面就把我的学习心得分享给大家,希望能让您的入门之路更顺畅。

2026年4月11日 23:40

数组函数传值(数组元素做函数参数——值传递)

数组函数传值(数组元素做函数参数——值传递)

大家好,如果您还对数组函数传值不太了解,没有关系,今天就由本站为大家分享数组函数传值的知识,包括数组元素做函数参数——值传递的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年4月11日 14:20

floor函数在哪个头文件(floor函数的用法)

floor函数在哪个头文件(floor函数的用法)

本篇文章给大家谈谈floor函数在哪个头文件,以及floor函数的用法对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年4月10日 10:20

excel公式vlookup怎么用法(excelvlookup函数使用方法)

excel公式vlookup怎么用法(excelvlookup函数使用方法)

本篇关于excel公式vlookup怎么用法的讲解,将摒弃陈词滥调,直击excelvlookup函数使用方法这一实战要害,给你可即刻应用的策略。

2026年4月8日 14:20

正弦函数c语言编程(怎么用c语言编正弦函数计算)

正弦函数c语言编程(怎么用c语言编正弦函数计算)

本文是您理解正弦函数c语言编程的最后一站。我们将通过剖析怎么用c语言编正弦函数计算,帮你打通任督二脉,彻底领悟。

2026年4月5日 12:40

substr函数的头文件(关于substr函数)

substr函数的头文件(关于substr函数)

你有没有想过,substr函数的头文件的关键突破口,可能就藏在关于substr函数之中?本篇内容将为你验证这个猜想。

2026年4月4日 03:40

二次函数根的表达式(知道二次函数的两个根怎么求原函数方法)

二次函数根的表达式(知道二次函数的两个根怎么求原函数方法)

关于二次函数根的表达式,您需要知道的几个关键点,尤其是知道二次函数的两个根怎么求原函数方法的深入解析,我们都将在这篇文章中涵盖。

2026年4月2日 06:40

priority queue(优先队列中的pop函数是将元素删除出来还是放到队尾)

priority queue(优先队列中的pop函数是将元素删除出来还是放到队尾)

各位朋友,关于priority queue的讨论一直很多,今天咱们不聊复杂的,就聚焦于优先队列中的pop函数是将元素删除出来还是放到队尾,用最直白的方式把它讲清楚。

2026年4月1日 18:20

更多文章:


哥斯达黎加加拿大比分(哥斯达黎加世预赛排名)

哥斯达黎加加拿大比分(哥斯达黎加世预赛排名)

是不是总觉得哥斯达黎加加拿大比分的知识体系太庞大,哥斯达黎加世预赛排名更是无从下手?本文将帮你化繁为简,抓住核心。

2026年4月12日 12:20

前端工程师求职信(java开发工程师求职申请怎么写)

前端工程师求职信(java开发工程师求职申请怎么写)

你是否好奇,为什么人人都在谈前端工程师求职信?它和java开发工程师求职申请怎么写之间究竟存在着怎样微妙的联系?答案就在下文。

2026年4月12日 12:00

tensorflow文档(如何理解tensorflow中的dimension)

tensorflow文档(如何理解tensorflow中的dimension)

嗨,正在屏幕前搜索tensorflow文档的你,是否也被如何理解tensorflow中的dimension的问题困扰过?今天这篇内容就是为你准备的。

2026年4月12日 11:40

mysql触发器语句(phpmyadmin的mysql触发器如何操作)

mysql触发器语句(phpmyadmin的mysql触发器如何操作)

关于mysql触发器语句,有一个概念至关重要,那就是phpmyadmin的mysql触发器如何操作。它为何如此重要?且听我们慢慢道来。

2026年4月12日 11:20

通用对话框的初始路径(如何还原cmd初始路径)

通用对话框的初始路径(如何还原cmd初始路径)

正如一位名家所言:“弄懂如何还原cmd初始路径,是通往通用对话框的初始路径殿堂的捷径。” 今天,我们就来走一走这条捷径。

2026年4月12日 11:00

构造函数的作用c(c++类中,默认构造函数究竟有什么作用为何声明对象后就要自动调用它这有何意义)

构造函数的作用c(c++类中,默认构造函数究竟有什么作用为何声明对象后就要自动调用它这有何意义)

想知道那些精通构造函数的作用c的人,是如何看待c++类中,默认构造函数究竟有什么作用为何声明对象后就要自动调用它这有何意义的吗?本篇将为你揭秘他们的思考路径。

2026年4月12日 10:40

特效视频app(有什么可以美化视频的软件(视频美化软件app))

特效视频app(有什么可以美化视频的软件(视频美化软件app))

承接之前对特效视频app的讨论,本篇我们将视角下沉,专门来聊聊实操中无法回避的有什么可以美化视频的软件(视频美化软件app)问题,让知识落地。

2026年4月12日 10:20

学校厕所pooping大便a(英语国际上厕所怎么说)

学校厕所pooping大便a(英语国际上厕所怎么说)

回顾我学习学校厕所pooping大便a的经历,英语国际上厕所怎么说可算是一个重要的转折点。正是搞懂了它,一切才变得顺畅起来。

2026年4月12日 10:00

idea批量替换添加后缀(idea快捷键介绍)

idea批量替换添加后缀(idea快捷键介绍)

本篇关于idea批量替换添加后缀的讲解,将摒弃陈词滥调,直击idea快捷键介绍这一实战要害,给你可即刻应用的策略。

2026年4月12日 09:40

cfiledialog(c++ CFileDialog m_ofn用法)

cfiledialog(c++ CFileDialog m_ofn用法)

您是否正在为搞不清cfiledialog和c++ CFileDialog m_ofn用法的关系而烦恼?恭喜,这篇干货就是您的“及时雨”。

2026年4月12日 09:20

最近更新

tensorflow文档(如何理解tensorflow中的dimension)
2026-04-12 11:40:02 浏览:0
cfiledialog(c++ CFileDialog m_ofn用法)
2026-04-12 09:20:01 浏览:0
热门文章

**art和**artly区别(**art是啥)
2026-03-30 23:20:01 浏览:0
api接口如何使用(api接口是什么)
2026-03-31 12:40:01 浏览:0
标签列表