1. 为什么要有构造函数和析构函数

面向对象的思想是从生活中来,手机、车出厂时,是一样的。

这些对象都是被初始化后才上市的,初始化是对象普遍存在的一个状态。

普通方案:

对每个类提供一个 init 函数,对象创建后立即调用 init 函数进行初始化。

这种方案麻烦,并且不易用于对象数组。

所以需要构造函数,对应需要析构函数。

2. 对象的构造

(1)构造函数的定义

C++类可以定义与类名相同的特殊成员函数,此函数为构造函数。

构造函数在定时可以有参数,但无任何返回类型声明。

(2)构造函数的调用

自动调用:对象定义时,C++编译器会自动调用构造函数。

手动调用:程序员可手动调用。

(3)构造函数的分类

//有参数构造函数的三种调用方法
class Test
{
private:
    int a;
    int b;

public:

    //无参数构造函数
    Test()
    {
        ;
    }

    //带参数的构造函数
    Test(int a, int b)
    {
        ;
    }
    //赋值构造函数
    Test(const Test &obj)
    {
        ;
    }

public:
    void init(int _a, int _b)
    {
        a = _a;
        b = _b;
    }
};

(4)构造函数的调用

(a)无参构造函数

Test t1,t2;

(b)有参构造函数

//有参数构造函数的三种调用方法
class Test5
{
private:
    int a;
public:
    //带参数的构造函数
    Test5(int a)
    {
        printf("\na:%d", a);
    }
    Test5(int a, int b)
    {
        printf("\na:%d b:%d", a, b);
    }
public:
};

int main55()
{
    Test5 t1();  //c++编译器默认调用有参构造函数 括号法
    Test5 t2 = (, ); //c++编译器默认调用有参构造函数 等号法
    Test5 t3 = Test5(); //程序员手工调用构造函数 产生了一个对象 直接调用构造构造函数法

    system("pause");
    ;
}

(c)拷贝构造

【1】在函数体内的拷贝构造

注意与拷贝函数区分。

#include "iostream"
using namespace std;

class AA
{
public:
    AA() //无参构造函数 默认构造函数
    {
        cout<<"我是无参构造函数,自动被调用了"<<endl;
    }
    AA(int _a) //无参构造函数 默认构造函数
    {
        a = _a;
        cout << "我是有参构造函数" << endl;
    }
    AA(const AA &obj2)
    {
        cout<<"我也是拷贝构造函数,我是通过另外一个对象obj2,来初始化我自己"<<endl;
        a = obj2.a + ;
    }
    ~AA()
    {
        cout<<"我是析构函数,自动被调用了"<<endl;
    }
    void getA()
    {
        printf("a:%d \n", a);
    }
protected:
private:
    int a;
};
//单独搭建一个舞台
void ObjPlay01()
{
    AA a1; //变量定义

    //赋值构造函数的第一个应用场景
    //用对象1 初始化 对象2
    AA a2 = a1; //定义变量并初始化 //初始化法

    a2 = a1; //用a1来=号给a2 编译器给我们提供的浅copy
}

int main()
{
    ObjPlay01();
    system("pause");
}

【2】函数传参时的拷贝构造

#include "iostream"
using namespace std;

class Location
{
public:
    Location(  ,  )
    {
        X = xx ;  Y = yy ;  cout << "有参构造\n" ;
    }
    Location( const Location & p )         //复制构造函数
    {
        X = p.X ;  Y = p.Y ;   cout << "拷贝构造" << endl ;
    }
    ~Location()
    {
        cout << X << "," << Y << " 析构" << endl ;
    }
    int  GetX () { return X ; }        int GetY () { return Y ; }
private :   int  X , Y ;
} ;

//alt + f8 排版
void f ( Location  p )
{
    cout << "Funtion:" << p.GetX() << "," << p.GetY() << endl ;
}

void mainobjplay()
{
    Location A ( ,  ) ;  //形参是一个元素,函数调用,会执行实参变量初始化形参变量
    f ( A ) ;
} 

void main()
{
    mainobjplay();
    system("pause");
}

(5)默认构造函数

两个特殊的构造函数:

1)默认无参构造函数

当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空。

2)默认拷贝构造函数

当类中没有定义拷贝构造函数时,编译器默认提供一个默认拷贝构造函数,进行浅拷贝。

(6)构造函数调用规则

1)当类中没有定义任何一个构造函数时,c++编译器提供默认无参构造函数和默认拷贝构造函数。

2)当类中定义了拷贝构造函数时,c++编译器不会提供拷贝构造函数。

3)当类中定义了任意非拷贝构造函数,c++编译器不会提供默认无参构造函数。

3. 对象的析构

(1)析构函数的定义

语法:~className()

作用:清理对象

(2)析构函数的调用

对象析构时,C++编译器自动调用。

C++基础 对象的管理——单个对象的管理的更多相关文章

  1. Objective-C 【单个对象内存管理(野指针&内存泄露)】

    ------------------------------------------- 单个对象内存管理 (1)野指针 ①定义了一个指针变量,但是并没有赋初值,它随机指向一个东西 ②某指针变量指向的内 ...

  2. oc55--ARC单个对象的内存管理

    // Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @end // Person.m #i ...

  3. redis基础02-redis的5种对象数据类型

    表格引用地址:http://www.cnblogs.com/xrq730/p/8944539.html 参考书籍:<Redis设计与实现>,<Redis运维与开发> 1.对象 ...

  4. [Python] 文科生零基础学编程系列一——对象、集合、属性、方法的基本定义

    1.编程语言: 1.1是什么: 编程语言(programming language),是用来定义计算机程序的形式语言.它是一种被标准化的交流技巧,用来向计算机发出指令. 一种计算机语言让程序员能够准确 ...

  5. JVM 基础:回收哪些内存/对象 引用计数算法 可达性分析算法 finalize()方法 HotSpot实现分析

    转自:https://blog.csdn.net/tjiyu/article/details/53982412 1-1.为什么需要了解垃圾回收 目前内存的动态分配与内存回收技术已经相当成熟,但为什么还 ...

  6. mybatis多表关联查询之resultMap单个对象

    resultMap的n+1方式实现多表查询(多对一) 实体类 创建班级类(Clazz)和学生类(Student),并在Student中添加一个Clazz类型的属性,用于表示学生的班级信息. mappe ...

  7. Docker笔记(二):Docker管理的对象

    原文地址:http://blog.jboost.cn/2019/07/14/docker-2.html 在Docker笔记(一):什么是Docker中,我们提到了Docker管理的对象包含镜像.容器. ...

  8. java基础:详解类和对象,类和对象的应用,封装思想,构造方法详解,附练习案列

    1. 类和对象 面向对象和面向过程的思想对比 : 面向过程 :是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的 面向对象 :是一种以对象为中心的编程思想,通过指挥对象实现具体的功能 1. ...

  9. Asp.net MVC 传递数据 从前台到后台,包括单个对象,多个对象,集合

    今天为大家分享下 Asp.net MVC 将数据从前台传递到后台的几种方式. 环境:VS2013,MVC5.0框架 1.基本数据类型 我们常见有传递 int, string, bool, double ...

随机推荐

  1. 学习路线 roadmap

    我的学习路线为HTML > CSS > Javsscript:Javascript是前端一切学习的基础.HTML和css一起学习. JavaScript基础: Js基础教程.js内置对象常 ...

  2. pc端的企业网站(IT修真院test8)详解1-4

    今天完成的事情:(1,伪元素:before,:after的使用.2.table的使用(collapse的使用)3rgba的高级运用) 今天我主要完成test8-3的页面. header和footer都 ...

  3. 好用的切换滑动焦点图框架jquery.superslide

    拿到学习网站:http://www.superslide2.com/

  4. nginx的常用命令

    一.nginx的解压安装 #tar xzvf nginx-1.6.0.tar.gz #cd nginx-1.6.0 #./configure    --prefix=/home/weixin/loca ...

  5. Canvas 中drawImage 绘制不出图片

    在使用Canvas的drawImage绘制图片时,却发现绘制不出图片,原因是图片是异步加载,图片加载完再绘制. //html <img src="1.png" /> & ...

  6. 使用ABAP(ADBC)和Java(JDBC)连接SAP HANA数据库

    在表DBCON里维护一条记录,指向HANA数据库.con_ENV里填入HANA数据库的主机名和端口号.如vmXXXX:30015 DATA: ls_new TYPE DBCON. ls_new-con ...

  7. Last_SQL_Errno: 1050

    主库上create table,从库上存在. 报错信息如下所示:                Last_SQL_Errno: 1050                Last_SQL_Error: ...

  8. Android(java)学习笔记61:Android中的 Application类用法

    1. 简介 如果想在整个应用中使用全局变量,在java中一般是使用静态变量,public类型:而在android中如果使用这样的全局变量就不符合Android的框架架构,但是可以使用一种更优雅的方式就 ...

  9. 【转】在程序中设置android:gravity 和 android:layout_Gravity属性

    在进行UI布局的时候,可能经常会用到 android:gravity  和 android:layout_Gravity 这两个属性. 关于这两个属性的区别,网上已经有很多人进行了说明,这边再简单说一 ...

  10. Bug分支

    软件开发中,bug就像家常便饭一样.有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除. 当你接到一个修复一 ...