C++类和对象:四个默认函数和运算符重载

本文深入探讨了C++中的类定义、成员访问控制、对象大小计算及类的默认成员函数等内容,包括构造函数、拷贝构造函数、析构函数等,并通过示例代码详细解释了这些概念的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.类
1.类的定义
类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(Instance)
,拥有类的成员变量和成员函数。

class Person
{
public:
    void  Display()
    {
        cout << _name << ":" << _age << ":"
             << _sex << ":" << _id << endl;

    }
    char* _name;
    int _age;
    char* _sex;
    int _id; 
};
void main()
{
    Person p;
    p._name = "Peter";
    p._age = 18;
    p._sex = "boy";
    p._id = 001;
    p.Display();//不能直接调用Display,在使用前要加对象。

2.访问限定符
public,private,protected
a.public成员可以从类外直接访问,private和protected成员不能从类外部直接访问到
b.每个限定符可以在类中多次使用,它的作用域是从该限定符出现到下一个限定符之前或类体结束之前
c.类体中如果没有定义限定符,则默认为私有的
d.类的访问限定符体现了面向对象的封装性
3.对象的大小的计算
所有变量之和(不算成员函数,成员函数存在于公共代码区)
在计算时遵从内存对齐:
内存对齐可以提高效率

class BB
{

};

输出时

cout<<sizeof(BB)<<endl;

结果为1。起到占位作用,表示这个类定义的对象是存在的
二.类的6个默认成员函数

1.构造函数
定义:要对私有的成员函数进行初始化,必须用一个公有的成员函数来进行。并且只在定义对象是自动执行一次。
特征:a.函数名和类名相同
b.无返回值
c.对象构造时系统自动调用对应的构造函数
d.可以重载
e.可以在类外定义,也可以在类体里定义
f.如果类定义中没有给出构造函数,则会自动生成一个缺省的构造函数(不传参数)
g.无参的构造函数和全缺省的构造函数都认为是缺省的构造函数,缺省的构造函数只能有一个

class Date
{
public:
    void Display()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }
    //无参的构造函数
    Date()
    {}
    //有参的构造函数
    Date(int year, int month, int day)
    {
        _year = year;
        _month = month;
        _day = day;

    }
private:
    int _year;
    int _month;
    int _day;
};

2.拷贝构造函数
定义:创建对象时用同类对象初始化
特征:a.是构造函数的重载
b.参数必须引用传参,否则会无穷递归
c.没有显示定义,系统会自动生成缺省的拷贝构造,依次拷贝类成员进行初始化

class Date
{
public:
    void Display()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }
    Date(int year = 1990,int month = 1 ,int day = 1)
    {
        _year = year;
        _month = month;
        _day = day;
    }
    Date(const Date& d)
    {
        _year = d._year;
        _month = d._month;
        _day = d._day;
    }//拷贝构造函数
private:
    int _year;
    int _month;
    int _day;
};

3.析构函数
定义:当一个对象的生命周期结束后,C++自动调用一个成员函数
特征:a.析构函数在类名前加~
b.无参无返回值
c.一个类有且只有一个析构函数,未定义时系统会自动生成缺省的析构函数
d.对象生命周期结束时,C++自动调用
e.进行清理工作

class Date
{
public:
    ~Date()
    {}
private:
    int _year;
    int _month;
    int _day;
};

4.赋值操作符重载
运算符重载:operator+合法的运算符构成函数名
不能改变优先级/结合性/操作数个数
5个不能重载的运算符: .* :: sizeof ?: .
赋值操作符重载定义:对一个已存在的对象进行拷贝赋值

class Date
{
public:
    Date(int year = 1990,int month = 1 ,int day = 1)
    {
        _year = year;
        _month = month;
        _day = day;
    }

    void Display()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }
        //bool operator == (Date* this,const Date& d)
    bool operator == (const Date& d)//隐含一个this指针
    {
        return _year == d._year
            && _month == d._month
            && _day == d._day;
    }
private:
    int _year;
    int _month;
    int _day;
};

    Date operator = (const Date& d)
    {
        if (this != &d)
        {
            this->_year = d._year;
            _month = d._month;
            _day = d._day;
        }
        return *this;
    }

这里写图片描述

d1 = d2 = d3;
Date& operator = (const Date& d)
//编译器系统会对以上代码做什么样的处理?


//d2.operator = (&d2,d3) =>return *this(d2)
//d1.operator = (&d1,d2.operator = (&d2,d3)) => return *this(d1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值