当前位置:三九宝宝网 → 宝宝百科 → 宝宝知识 → 正文

c中什么时候调用构造函数和析构函数

更新:02-25 整理:39baobao.com
字体:

[C#默认构造函数的作用]构造函数主要用来初始化对象。它又分为静态(static)和实例(instance)构造函数两种类别。大家应该都了解如果来写类的构造函数,这里只说下默认构造函数的作用,以及在类中保留默...+阅读

在对象被创建的时候就会调用构造函数,比如 声明一个类class A{...},当你在main函数中 A a ; 定义一个对象a的时候, 就调用构造函数,默认构造函数都是无参数的 ,构造函数就相当给对象a初始化而已,就相当于c语言中 int a = 3 初始化a的值而已,以为你在类中是不能直接给private中的类成员赋值的,所以就靠构造函数,不过要注意有参构造和无参构造,默认都是无参的,比如你A a(1, 3)这样的就不对了 除非你在类中写一个带参数的构造函数。 当函数调用结束的时候,会自动调用析构函数,比如你在clsaa A { public:Add().....}, 当你A a; a.Add();后 就自动调用析构,你可以在类中 ~A{cout。。。},你就会发现调用 a.Add() 后就打出你在析构函数中写的东西,是自动调用的,析构的作用就是释放对象占用的资源。

以为默认析构什么也不打印,所以你不会直观看出析构函数什么时候执行,自己在析构中加上打印的语言你就会看到了。希望对你能有所帮助

C类的构造函数调用问题

默认构造函数: 声明类的对象的时候 声明类的数组的时候(每个元素会单独调用一次) 调用等号运算符的时候(等号左边的变量会先调用一次)================================================ 最后一句是不对的。上两句是对的 如果等号左边的变量还没有实例化的话,只会调用拷贝构造函数,不会调用默认构造函数的,也不会调用=运算符。 即 CTest aa; //调用默认构造函数 CTest bb = aa; //只会调用拷贝构造函数,不会调用默认构造函数的,也不会调用=运算符。就相当于 CTest bb(aa); 但是如果 aa = bb; //这只会调用=运算符,因为aa已经实例化了 要弄明白拷贝构造函数的意思,就是拷贝一个对象来构造另外一个对象,重点是“构造”这个词,如果说aa已经被构造了(实例化),那下面还要构造什么呢,也就不会再调用拷贝构造函数了,能进行的操作只能是重新赋值而已,就是=运算符。

但是像CTest bb = aa; 因为bb还没有构造,那只能调用拷贝构造函数了 拷贝构造函数: 类的对象作为参数传递给函数的时候 类的对象作为返还值的时候 ==================================== 第一句是对的,第二句是不对的。比如 假如有个函数是这样(返回类型不管是不是引用类型,下面的结果都是一样): CTest getTest() { return m_myTest; } 那么, CTest aa; //实例化aa,调用默认构造函数 aa = getTest(); //只会调用 = 运算符,不会调用任何构造函数,因为aa已经实例化了。 CTest bb = getTest(); //此时返回值后只会调用拷贝构造函数,不会调用其他的函数,包括=运算符也不会被调用。 所以不论是赋值还是调用,只要看赋值左边的变量是否已经被实例化了,如果实例化了,只会调用=运算符, 如果没有,只会调用拷贝构造函数。

类的对象作为参数传递给函数的时候(不是引用类型),就是把一个对象给一个没有实例化的变量赋值,所以这时只会触发拷贝构造函数,而不是其它函数。 这些都是硬道理,没什么再深入讲的,如果实在不明白,就死记着吧。

系统能够调用构造函数为我圈出来的对象开辟存储空间

调用的不是系统自动生成的无参构造函数,而是定义中有三个参数的构造函数。

三个参数的构造函数的三个参数都有默认值,所以如果不传参数则表示使用默认值,这是含带默认值参数的函数的基本用法啊。

比如:

int add(int a=0, int b=1, int c=2)

{

return a+b+c;

}

int a=add(); // a=0+1+2=3

int b=add(3); // b=3+1+2=6

int c=add(3,10); // c=3+10+2=15

int d=add(3,10,100); // d=3+10+100=113四次调用都是调用的add函数,根据传入的参数的个数不同而决定是否使用默认参数值。

定义一个对象数组时是如何调用构造函数和析构函数的

#include

#include

using namespace std;

//对象数组的初始化请看该函数

class student

{

public:

student(string name)

{

m_strname=name;

}

student(){}

void display()

{

cout<<"student name:"<

}

private:

string m_strname;

};

void main()

{

student stu[3]={student("zhangsan"),student("lisi")};

stu[0].display();

stu[1].display();

}

//深入了解构造和析构函数过程参看该函数!

#include

using namespace std;

class study

{

private:

int num;

public:

study()

{

cout << "study default constructing^" << endl;

}

study(int a)

{

num = a;

cout << "study constructing^ " << num << endl;

}

~study()

{

cout << "study desctructing^" << endl;

}

};

void main()

{

study example[5] = {study(1),study(2),study()};

}

本文地址:https://www.39baobao.com/show/39_322897.html

以上内容来自互联网,请自行判断内容的正确性。若本站收录的信息无意侵犯了贵司版权,请联系我们,我们会及时处理和回复,谢谢.

以下为关联文档:

c语言:用调用子函数的方法任意输入一个年份判断是否是闰年/* 首先判断是否是整百年,若是,是否能被400整除,能-闰年,否-平年 若不能被400整除,则是否能被4整除,能-闰年,否-平年 设panduan是判断是否闰年的函数,在主函数中调用他 */ #include"s...

如何学好VB中的API函数调用关于API函数的书!市场上太少了!就算是有,也介绍得很粗浅!你到书店好好找找!我没有API函数的好书介绍给你! 谈一下我的心得吧: 首先,有必要向大家讲一讲,什么是API。API是包含在一个附...

Java中有关构造函数请教final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或...

数学中指数函数对数函数函数的运算法则当指数x是正整数n时,a^n叫做正整数指数幂. 当指数x是0,且a不等于0时,a^0叫做零指数幂. 当指数x是负整数-n,且a不等于0时,a^-n叫做负整数指数幂. 以上各种幂统称为整数指数幂 整数...

请教怎么调用DLL中的函数TypeTShowReport= REPEDIT(A:THandle;B:TComponent;C:String;D:TStrings;E:Word;F:TFileName):Integer;Stdcall; EDLLLoadError=Class(Exception);//调用DLL的函数:Function (...

函数调用函数指针一般需要定义一个函数指针类型 typedef int (*function_pointer_t) ( int arg1, int arg2 );然后,定义函数指针变量 function_pointer_t fp_invoker = 0;函数指针可以动态改变...

JS函数调用及作用域链数组索引要为整形 即xx[key] 中的key必须是整形的,你传的'v'+i 是不对的,应该这样写: (function() { a = function() { var xx = new Array(); for (var i = 1; i <= 3; i++) {...

c构造函数发生错误应该如何处理1、构造函数想通知外部自己构造失败,只有抛异常这一个途径(没有返回值); 2、 如果不抛异常,那么构造函数执行完毕,从语言层面上编译器认为该对象是正确构造了的,其实构造没有按预想...

怎样调用用PB生成的dll文件中的函数怎样调用用PB生成的dll文件中的函数,PB调用 dll文件的问题:利用pb生成的DLL不是标准的DLL,而是com对象。不能用一般方法来调用,只能通过ole方式。 按照下面的方法自己进行调整以...