C++的对象的构造(上)

对象的构造

1、下面的类定义中成员变量i和j的初始值是多少?

class Test
{
private:
	int i;
	int j;
public:
	int getI()
	{
		return i;
	}
	int getJ()
	{
		return J;
	}
//初始值是不一定的,随机的

例题分析:

#include <stdio.h>

//类是一个自定义类型
class Test
{
private:
    int i;
    int j;
public:
    int getI() { return i; }
    int getJ() { return j; }

};

Test gt;      //全局数据区 初始值为0

int main()
{
    printf("gt.i = %d\n", gt.getI());
    printf("gt.j = %d\n", gt.getJ());
    
    Test t1;        //类是一个自定义类型,所以我们可以把改创建的对象看成一个变量
    
    printf("t1.i = %d\n", t1.getI());
    printf("t1.j = %d\n", t1.getJ());
    
    Test* pt = new Test;
    
    printf("pt->i = %d\n", pt->getI());
    printf("pt->j = %d\n", pt->getJ());
    
    delete pt;
    
    return 0;
}

在这里插入图片描述

对象的初始化

1、从程序设计的角度,对象只是变量,因此:
	----在栈上创建对象时,成员变量初始值为一个随机值;
	----在堆上创建对象时,成员变量初始值为一个随机值;
	----在静态存储区创建对象时,成员变量初始值为零。
2、生活中的对象都是在初始化后再上市的;
3、初始化(出厂设置)是对象普遍存在的一个状态;
		**那我们应该怎样对一个对象进行初始呢?**
4、一般而言,对象都需要一个确切的初始状态
5、解决方案
	----在类中提供一个public的initialize函数
	----对象创建后立即调用initialize函数进行初始化
6、存在的问题
	----initialize只是一个普通的函数,必须显示调用;
	----如果未调用initialize函数,运行结果是不确定的。
#include <stdio.h>

//类是一个自定义类型
class Test
{
private:
    int i;
    int j;
public:
    int getI() { return i; }
    int getJ() { return j; }
    //添加了一个初始化函数
    void initialize()
    {
    	i = 1;
    	j = 2;
    } 
};

Test gt;      //全局数据区 初始值为0

int main()
{
	gt.initialize();
    printf("gt.i = %d\n", gt.getI());
    printf("gt.j = %d\n", gt.getJ());
    
    Test t1;       //相当于一个局部变量
	
    t1.initialize();
    printf("t1.i = %d\n", t1.getI());
    printf("t1.j = %d\n", t1.getJ());
    
    Test* pt = new Test;  //在堆上申请一段内存
	
    pt->initialize();
    printf("pt->i = %d\n", pt->getI());
    printf("pt->j = %d\n", pt->getJ());
    
    delete pt;
    
    return 0;
}
//这个添加初始化函数时有个缺点,就是在创建对象时一定要调用这个函数,而且添加初始化函数的顺序不能颠倒,

在这里插入图片描述

构造函数

1、C++ 中可以定义与类名相同的特殊成员函数
----这种特殊的成员函数叫做构造函数;
a、构造没有任何返回类型的声明
b、构造函数在对象定义是自动被调用

#include <stdio.h>

//类是一个自定义类型
class Test
{
private:
    int i;
    int j;
public:
    int getI() { return i; }
    int getJ() { return j; }
    //构造函数,会自动被调用
    Test()
    {
        printf("Test() Begin\n");
        
        i = 1;
        j = 2;
        
        printf("Test() End\n");
    }
};

Test gt;      //全局数据区 初始值为0

int main()
{
    printf("gt.i = %d\n", gt.getI());
    printf("gt.j = %d\n", gt.getJ());
    
    Test t1;       //相当于一个局部变量
    
    printf("t1.i = %d\n", t1.getI());
    printf("t1.j = %d\n", t1.getJ());
    
    Test* pt = new Test;
    
    printf("pt->i = %d\n", pt->getI());
    printf("pt->j = %d\n", pt->getJ());
    
    delete pt;
    
    return 0;
}

在这里插入图片描述

小结

1、每个对象在使用之前都应该初始化;
2、类的构造函数用于对象的初始化;
3、构造函数与类同名并且没有返回值
4、构造函数在对象定义时自动被调用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值