为什么用构造函数与析构函数


构造函数:

c++目标是让使用类对象就像使用标准类型一样,但是常规化的初始化句法不适用与类类型。

 int year =; //基本类型
struct thing {
char *pn;
int m;
};
thing amabob = {"jiang",-}; //结构体的初始化,结构体默认的访问类型是public,可以直接访问

类对象的数据部分的访问状态都是私有的,程序不能直接访问数据成员。

程序只能通过成员函数才能访问数据成员,因此要设计合适的成员函数,才能成功的将对象初始化。

析构函数:

用构造函数创建对象后,程序负责跟踪该对象,直到过期为止,对象过期时,程序将自动调用一个特殊的成员函数,析构函数。如果构造函数用new来分配内存,则析构函数用delete来释放这些内存。

如果大家还想了解的更多,可以参考陈树振老师的博文:http://blog.csdn.net/chenshuzhenteacher/article/details/8094577


怎么用构造函数与析构函数


构造函数

c++提供了两种方法初始化对象的方式,第一种是显式的调用构造函数:

Stock food = Stock ("World Cabbage",250,1.25);

另外一种是隐式调用构造函数

Stock garment("Furry Marson",50,2.5);

每次创建类对象(甚至使用new动态分配内存)时,C++都会使用类的构造函数。

Stock *pstock = new Stock("Elect",18,19);

无法使用对象调用构造函数,因为构造函数构造对象之前,对象是不存在的,因此构造函数用来创建对象,而不能通过对象来调用。

  1. 默认构造函数
  2. 无参构造函数
  3. 有参构造函数
  4. 拷贝构造函数
  5. 赋值构造函数

1.默认构造函数是在未提供显式的初始化值是被用来创建对象的构造函数,用于以下声明:

Stock stock;

创建stock对象,但不初始化成员,这和下面的语句

int x;

创建x,但没有提供值给他一样。默认构造函数没有参数,因此声明中不包含值。

如果提供非默认构造函数(如Stock(const char* co,int n,double pr)),但没有提供默认构造函数,则下面的声明是错误的:

Stock stock;

如果想要创建对象,而不显式的初始化,必须定义不接受任何参数的默认构造函数,有两种方法。

一种是给已有构造函数的所有参数提供默认值。Stock(const char *no = "ERROR",int n = 0 ,double pr = 0.0);

另一种方式是通过函数重载来定义另一个构造函数 Stock();

Stock first("dajdke"); //call constructor

Stock second(); //declares a function

Stock third;  //calls default constuctor

第一个声明调用非默认构造函数,即接收参数的构造函数,第二个声明指出,second()是一个返回Stock对象的函数,隐式的调用函数默认构造函数,不要使用圆括号。

2、无参构造函数

Type();
就是构造函数中没带参数。

3、有参构造函数

Type(int a );
就是构造函数中含有参数。

4、拷贝,赋值构造函数

class String {

private:
char * m_data; public:
String(const char *str = NULL); //普通构造函数
String(const String &other); //拷贝构造函数
String &operator = (const String &other); //赋值函数
~String(void); //析构函数 }; String::String(const char *str)
{
cout<<"自定义构造函数"<<endl;
if (str ==NULL) {
m_data = new char[];
*m_data = '\0';
} int length = sizeof(str);
m_data = new char[length+];
strcpy(m_data, str); }
String::String(const String &other)
{
cout<<"自定义拷贝构造函数"<<endl;
int length = sizeof(other.m_data);
m_data = new char [length + ];
strcpy(m_data, other.m_data); }
String &String:: operator=(const String &other)
{
cout<<"自定义赋值"<<endl;
if (this == &other) {
return *this;
}
else
{
delete [] m_data;
int length = sizeof(other.m_data);
m_data = new char [length + ];
strcpy(m_data, other.m_data);
return *this;
}
} String::~String()
{
cout<<"调用的析构函数"<<endl;
delete [] m_data;
} int main(int argc, const char * argv[])
{
cout<<"a(\"abc\")"<<endl;
String a("abc");//自定义构造函数
String b("cde");//自定义构造函数
String d = a;//自定义拷贝构造函数
String c(b);//自定义拷贝构造函数
c=a;// 自定义赋值
}

参考:http://blog.csdn.net/twlkyao/article/details/9104537

c++类的构造函数与析构函数的更多相关文章

  1. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  2. C++:派生类的构造函数和析构函数

    4.2 派生类的构造函数和析构函数4.2.1 派生类构造函数和析构函数的执行顺序 通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数:当撤销派生类对象时,则先执行派生类 ...

  3. C++学习之路—继承与派生(二):派生类的构造函数与析构函数

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 由于基类的构造函数和析构函数是不能被继承的,所以 ...

  4. C++:派生类的构造函数和析构函数的调用顺序

    一.派生类 在C++编程中,我们在编写一个基类的派生类时,大致可以分为四步: • 吸收基类的成员:不论是数据成员还是函数成员,派生类吸收除基类的构造函数和析构函数之外的全部成员. • 改造基类函数:在 ...

  5. C++学习笔记(6)----基类和派生类的构造函数和析构函数的执行顺序

    基类和派生类:构造函数和析构函数的执行顺序 在Visual Studio中,新建控制台工程,构造类如下: #include<iostream> using namespace std; c ...

  6. cc28c_demo.cpp,派生类的构造函数和析构函数-代码示范3

    cc28c_demo.cpp,派生类的构造函数和析构函数-代码示范3 //派生类的构造函数和析构函数//派生类的构造函数(执行步骤)//--执行基类的构造函数//--执行成员对象的构造函数//--执行 ...

  7. C++将类的构造函数、析构函数声明为private或者protected的用途

    如果将构造函数.析构函数声明为private或者protected,表示不能从类的外部正常调用构造和析构函数了. 这种用法的通常使用的场景如下: 1.如果不想让外面的用户直接构造一个类A的对象,而希望 ...

  8. c++, 派生类的构造函数和析构函数 , [ 以及operator=不能被继承 or Not的探讨]

    说明:文章中关于operator=实现的示例,从语法上是对的,但逻辑和习惯上都是错误的. 参见另一篇专门探究operator=的文章:<c++,operator=>http://www.c ...

  9. 拷贝构造函数,深拷贝,大约delete和default相关业务,explicit,给定初始类,构造函数和析构函数,成员函数和内联函数,关于记忆储存,默认参数,静态功能和正常功能,const功能,朋友

     1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.另外一种初始化的方式是直接在构造方法里面实现初始化. 案比例如以 ...

随机推荐

  1. CreateCompatibleDC工作原理

    WindowsGDI的接口没提供这种功能机制.仅仅能是先通过CreateCompatibleDC 创建一个与显示器设备内容兼容的内存设备内容.用SelectObject将位图选入内存设备内容,再用Bi ...

  2. HDU 2841 Visible Trees(数论)

    标题效果:给你个m*n方格,广场格从(1,1)开始. 在树中的每个点,然后让你(0,0)点往下看,问:你能看到几棵树. 解题思路:假设你的视线被后面的树和挡住的话以后在这条线上的树你是都看不见的啊.挡 ...

  3. OCP-1Z0-051-标题决心-文章5称号

    5. Which SQL statements would display the value 1890.55 as $1,890.55? (Choose three .) A. SELECT TO_ ...

  4. eclipse 组态xdebug

    1.打开浏览器打开phpinfo页面视图PHP版本号.TS(线程安全)版本NTS(非线程安全)版本.以及VC6版本号是VC9版本号 2.和上面版本号相应的xdebug:http://xdebug.or ...

  5. 关于微软公有云Azure会计标准

    前几年.中国的云计算项目往往搞成了房地产项目.大搞形"象project",没有实质性的内容.云计算老总成了房地产大老板,国内业界是在胡闹! 现今,世纪互联与微软(中国)联手搞公有云 ...

  6. javascript实现数据结构:广义表

    原文:javascript实现数据结构:广义表  广义表是线性表的推广.广泛用于人工智能的表处理语言Lisp,把广义表作为基本的数据结构. 广义表一般记作: LS = (a1, a2, ..., an ...

  7. JS开发调试

    开发调试工具   页面制作之开发调试工具(1) 开发工具介绍 开发工具一般分为两种类型:文本编辑器和集成开发环境(IDE) 常用的文本编辑器:Sublime Text.Notepad++.EditPl ...

  8. http层负载均衡之haproxy

    http层负载均衡之haproxy实践篇(一) 方案 上篇文章讲到了负载均衡的相关理论知识,这篇文章我打算讲讲实践方法以及实践中遇到的问题 方案:haproxy http层负载均衡 安装一个hapro ...

  9. CSS3火焰文字特效制作教程

    原文:CSS3火焰文字特效制作教程 用一句很俗气的话概括这两天的情况就是:“最近很忙”,虽然手头上有不少很酷的HTML5和CSS3资源,但确实没时间将它们的实现过程写成教程分享给大家.今天刚完成了一个 ...

  10. CSS3+HTML5特效5 - 震动的文字

    先看效果(把鼠标移上去看看) abcd 这个效果很简单,就是移动文字的位置模拟出震动的效果. Css <style> @-webkit-keyframes shake { 0%{ -web ...