• 构造函数


    ---------------siwuxie095

       

       

       

       

       

       

       

       

    关于类和对象的思考:

       

    1)实例化的对象是如何在内存中存储的?

    2)类中的代码又是如何存储的?

    (3)代码和数据又有怎样的关系?

       

       

       

       

       

    对象结构

       

       

    要想说清对象是如何存储的,必须先了解内存中按照用途被划分的 5 个区:

       

       

       

    1)栈区

       

    定义的变量存储在栈区,其特点为:内存由系统进行控制,无论是分配

    还是回收,都不需要程序员来关心

       

       

    2)堆区

       

    如果分配内存时使用 new 运算符,则 new 出的内存存储在堆区,未来

    必须使用 delete 来回收

       

    3)全局区

       

    存储全局变量和静态变量

       

       

    4)常量区

       

    存储字符串和常量

       

       

    5)代码区

       

    存储编译之后的二进制代码

       

       

       

    如:定义一个汽车类

       

       

       

    在该类被实例化之前,不会占用栈 或堆中内存,但当它实例化之后,

    每个对象都会在栈上开辟出一段内存,用来存储各自的数据,它们是

    不同的变量,占据着不同的内存,而逻辑代码只编译出了一份,放在

    代码区,代码区中的代码供所有的对象使用,谁需要它就去调用它,

    找到相应的代码入口即可

       

       

       

    注意:

       

    当实例化 3 个对象后,每个对象中的数据都是不可控的,都是未知的,

    因为没有对这些数据进行初始化

       

       

       

    如果没有初始化,就无法对这些数据进行预想的逻辑操作,

    显然,必须对数据进行初始化

       

       

       

       

    对象初始化

       

       

    如:坦克大战中坦克出现位置的初始化

       

       

       

       

    对于对象的初始化来说,不同的场合,有些只需要初始化一次,有些则要

    根据条件初始化多次

       

       

       

       

    初始化函数如何避免误操作而给程序带来的可能的灭顶之灾

       

       

       

       

    为了帮助程序员避开这些风险,C++ 推出了构造函数:

       

       

       

       

    1)构造函数最大的特点 在对象实例化时被自动调用,通常只需要将

    初始化的代码写在构造函数内,就能起到初始化数据的作用了。需要强调

    的是,构造函数在实例化对象时被调用且仅被调用一次

       

    2)定义构造函数时,构造函数的名字要和类名同名

       

    3)构造函数也没有返回值

       

    4)构造函数可以进行重载

       

    5)实例化对象时,即便有多个构造函数,也仅用到其中一个构造函数

       

    (6)当用户没有定义构造函数时,编译器将自动生成一个构造函数,

    其中没有做任何的事情,为空

       

       

       

    如:无参构造函数

       

       

       

       

    再如:有参构造函数

       

       

       

       

    再如:重载构造函数

       

       

       

       

       

    程序:

       

    Teacher.h:

       

    #include <string>

    using namespace std;

       

       

    class Teacher

    {

    public:

    //无参构造函数

    Teacher();

    //有参构造函数,这里给age了一个默认值20 name也给默认值

    //t1在实例化时就不知道该调用哪个构造函数,就不能通过编译

    Teacher(string name, int age = 20);

    void setName(string name);

    string getName();

    void setAge(int age);

    int getAge();

    private:

    string m_strName;

    int m_iAge;

    };

       

       

       

    Teacher.cpp:

       

    #include "Teacher.h"

    #include <iostream>

    using namespace std;

       

    Teacher::Teacher()

    {

    m_strName = "Jim";

    m_iAge = 5;

    cout << "Teacher()" << endl;

    }

       

    Teacher::Teacher(string name, int age)

    {

    m_strName = name;

    m_iAge = age;

    cout << "Teacher(string name, int age)" << endl;

    }

       

    void Teacher::setName(string name)

    {

    m_strName = name;

    }

       

    string Teacher::getName()

    {

    return m_strName;

    }

       

    void Teacher::setAge(int age)

    {

    m_iAge = age;

    }

       

    int Teacher::getAge()

    {

    return m_iAge;

    }

       

       

       

    main.cpp:

       

    #include<stdlib.h>

    #include "Teacher.h"

    #include<iostream>

    #include <string>

    using namespace std;

       

       

    int main(void)

    {

    Teacher t1;

    Teacher t2("Merry", 15);

    Teacher t3("James");

    cout << t1.getName() << " " << t1.getAge() << endl;

    cout << t2.getName() << " " << t2.getAge() << endl;

    cout << t3.getName() << " " << t3.getAge() << endl;

    system("pause");

    return 0;

    }

       

       

       

       

       

       

       

       

    【made by siwuxie095】

  • 相关阅读:
    托管代码和非托管代码效率的对比
    托管程序与非托管程序的区别
    第15章 C# ADO.NET数据库操作
    第14章 C#进程与线程
    第13章 C#异常与调试
    第12章 C# WinForm
    第11章 C#委托和事件
    第10章 C#文件操作
    第9章 C#泛型
    第8章 C#集合
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6791947.html
Copyright © 2020-2023  润新知