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. intellijidea课程 intellijidea神器使用技巧2-1 无处不在的跳转

    idea快捷键(基于windows平台) 1 书签跳转 Ctrl alt [ ]   ==> 项目之间的跳转 Ctrl shift E ==> 文件之间的跳转(最近编辑的文件) Ctrl ...

  2. Dreams save us. Dreams lift us up and transform us into something better.

    Dreams save us. Dreams lift us up and transform us into something better.梦想能够拯救我们.梦想能够激励我们并让我们成为更好的人 ...

  3. python列表生成式、列表推导式

    运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁. 格式 [x for x in 内容] [x for x in 内容 if 条件] 1:要把生成的元素 ...

  4. Educational Codeforces Round 14 - F (codeforces 691F)

    题目链接:http://codeforces.com/problemset/problem/691/F 题目大意:给定n个数,再给m个询问,每个询问给一个p,求n个数中有多少对数的乘积≥p 数据范围: ...

  5. Javascript作业—取字符串的第一个只出现一次的字母

    js作业 取字符串第一个只出现一次的字母 <script type='text/javascript'> //取a-z字符串中第一个只出现一次的字母 function firstUniqu ...

  6. .net core 2.0以上版本加载appsettings.json

    这里需要的一个关键类: Microsoft.Extensions.Configuration; 可以从nuget包获得 如果缺少该类,会造成无法实例化调用方法: ConfigurationBuilde ...

  7. Uva 11806 拉拉队

    题目链接:https://uva.onlinejudge.org/external/118/11806.pdf 题意: n行m列的矩阵上放k个棋子,其中要求第一行,最后一行,第一列,最后一列必须要有. ...

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

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

  9. 文本编辑器Vim技巧

    1.  导入文件内容  :r  文件名 2.  插入当前日期  :r  !date 3. :!which ls 4. :r !命令

  10. mysql中locate和substring函数使用

    locate函数使用 LOCATE(substr,str) 1.如果子串 substr 在 str 中不存在,返回值为 0: 2.如果子串 substr 在 str 中存在,返回该字符串第一次出现的位 ...