c++类的构造函数与析构函数
为什么用构造函数与析构函数
构造函数:
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.默认构造函数是在未提供显式的初始化值是被用来创建对象的构造函数,用于以下声明:
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++类的构造函数与析构函数的更多相关文章
- 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)
[源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...
- C++:派生类的构造函数和析构函数
4.2 派生类的构造函数和析构函数4.2.1 派生类构造函数和析构函数的执行顺序 通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数:当撤销派生类对象时,则先执行派生类 ...
- C++学习之路—继承与派生(二):派生类的构造函数与析构函数
(根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 由于基类的构造函数和析构函数是不能被继承的,所以 ...
- C++:派生类的构造函数和析构函数的调用顺序
一.派生类 在C++编程中,我们在编写一个基类的派生类时,大致可以分为四步: • 吸收基类的成员:不论是数据成员还是函数成员,派生类吸收除基类的构造函数和析构函数之外的全部成员. • 改造基类函数:在 ...
- C++学习笔记(6)----基类和派生类的构造函数和析构函数的执行顺序
基类和派生类:构造函数和析构函数的执行顺序 在Visual Studio中,新建控制台工程,构造类如下: #include<iostream> using namespace std; c ...
- cc28c_demo.cpp,派生类的构造函数和析构函数-代码示范3
cc28c_demo.cpp,派生类的构造函数和析构函数-代码示范3 //派生类的构造函数和析构函数//派生类的构造函数(执行步骤)//--执行基类的构造函数//--执行成员对象的构造函数//--执行 ...
- C++将类的构造函数、析构函数声明为private或者protected的用途
如果将构造函数.析构函数声明为private或者protected,表示不能从类的外部正常调用构造和析构函数了. 这种用法的通常使用的场景如下: 1.如果不想让外面的用户直接构造一个类A的对象,而希望 ...
- c++, 派生类的构造函数和析构函数 , [ 以及operator=不能被继承 or Not的探讨]
说明:文章中关于operator=实现的示例,从语法上是对的,但逻辑和习惯上都是错误的. 参见另一篇专门探究operator=的文章:<c++,operator=>http://www.c ...
- 拷贝构造函数,深拷贝,大约delete和default相关业务,explicit,给定初始类,构造函数和析构函数,成员函数和内联函数,关于记忆储存,默认参数,静态功能和正常功能,const功能,朋友
1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.另外一种初始化的方式是直接在构造方法里面实现初始化. 案比例如以 ...
随机推荐
- 面向对象三大特征之多态——Java笔记(七)
多态: 同一个实体同时具有多种形式 编译时的类型有声明该变量时使用的类型决定,运行时的类型有实际赋值给变量的对象决定 如果编译时类型和运行时类型不同,就出现多态 例: clas ...
- 承诺c指针 (1)指针是地址
(1)是地址 首先明白一个观点:指针就是地址.这是理解指针的起始一步. 直观感受下.变量的地址 int main() { int foo; int *foo_p; foo = 5; foo_p = & ...
- AT&T汇编——在你开始写
不知不觉,少年将超过,计算机相关知识,学到基本上可以说是教过.毕业.所以,我们打算更深入了解自己的兴趣背着背笼.也因为它是检讨大学. 计划写的内容在: 1.汇编语言 2.C/C++语言 3.Linux ...
- sql 子查询stuff功能(同一个人的多任务,多领域成为字符串)
USE [erp2015] GO /****** Object: StoredProcedure [dbo].[GetUser] Script Date: 03/14/2015 13:27:04 ** ...
- windows下系统移植到linux下出现的问题
今天遇到了一个之前没有遇到的问题,记录一下. 我们是在windows下进行开发的,最终系统是部署在linux服务器上. 在windows一切正常,但是部署到linux下时,有些功能不能用了.通过log ...
- android之【本地通知Notification】
public class NotificationTest extends Activity { static final int NOTIFICATION_ID = 0x1123; @Overrid ...
- 6最好的之一 HTML5/CSS3 演示(PPT)框架
HTML 是全世界最流行的网页编程语言.而HTML5是这门语言的升级版本号.越来越多的开发人员和设计师開始使用HTML5.以下介绍几个 HTML5/CSS3 的演示工具和框架,你能够用它们来创建你的网 ...
- 归并排序 & 快速排序
归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有 ...
- asp.net 获得客户端 mac 地址
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- 快速构建Windows 8风格应用26-本地应用数据
原文:快速构建Windows 8风格应用26-本地应用数据 本篇博文主要介绍如何获取应用的设置和文件容器.如何将数据写入设置.如何从设置中获取数据.如何删除设置中数据.如何将数据写入文件.如何从文件中 ...