CPP基础知识(二)--类和对象

本文介绍了C++中类和对象的基础知识,包括类的定义、访问限定符、封装性等概念,以及构造函数、拷贝构造函数、析构函数和赋值运算符重载的相关知识。

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

1:类和对象的基础知识,如类的定义,访问限定符,面向对象封装性,对象的大小计算等等。

类的定义:类其实是一种由用户定义的特殊的(类型中包含了对数据操作的函数)数据类型,它是将不同类型的数据和这些数据相关的操作封装在一起的集合体。

类的定义格式:

class<类名>
{
   public:
   <成员函数或数据成员的说明>
   private:
   <数据成员或成员函数的说明>
};

<各个成员函数的实现>

类的成员包括数据成员和成员函数两部分,类的成员又分为:共有的(public)、私有的(private)和保护的(protected)3类。

访问限定符(访问权限修饰符): public,private,protected。它们在类体内(即一对花括号内)出现的先后顺序无关,并且允许多次出现,用他们来说明类成员的访问权限。
注意:若没有访问限定符,默认该成员是私有的;类外只能访问共有的成员,不能访问私有的成员。

面向对象的封装性:封装性就是把对象的成员属性(数据)和成员方法(函数)结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节,包含如下两个含义:
1>把对象的全部成员属性和全部成员方法结合在一起,形成一个不可分割的独立单位(即对象);
2>信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界,只保留有限的对外接口是指与外部发生联系。

例:

//创建一个学生类
class Student
{
//私有成员(数据),类外不能访问
    private:
        char*_name;
        int _age;
        char*_sex;
//共有成员函数,允许类外访问
    public:
        int Print(int x)
        {
            printf("%d ", x);
        }
};

对象的大小计算:对象的大小为类中所有成员的大小之和(并且要遵循):
第一个成员在与结构体变量偏移量为0的地址处,其他成员要对齐到改成员的对齐数的整数倍的地址处,结构体的总大小为最大对其数的整数倍。
默认对其数:VS中为8,Linux中为4。

2:四个默认成员函数(构造函数、拷贝构造函数、析构函数和赋值运算符重载)及运算符重载相关知识

(1)构造函数:成员变量为私有的,要对其初始化必须用一个共有的成员函数来进行。且这个函数且在定义对象时自动执行一次,这个函数成为构造函数。
(2)拷贝构造函数:创建对象时使用同类对象来进行初始化,这时用的构造函数称为拷贝构造函数,拷贝构造函数是特殊的构造函数

class Date
{
public:
//无参构造函数
    Date()
    {}
//带参的构造
    Date(int year, int month, int day)
    {
        _year = year;
        _month = month;
        _day = day;
    }
//缺省参数的构造函数
    Date(int year = 2017, int month=1,int day=1)
    {
        _year = year;
        _month = month;
        _day = day;
    }
//拷贝构造函数
    Date(const Date&d)
    {
        _year = d._year;
        _month = d._month;
        _day = _day;

private:
    int _year;
    int _month;
    int _day;
};
void test()
{
    Date d1;
    Date d2(2015, 1, 1);
    Date d3();

}
void main()
{
    test();
}

构造函数特征如下:
a.函数名与类名相同;
b.无返回值;
c.创建对象时系统会自动调用;
d.该函数可以重载;
e.构造函数可以在类里或者类外定义;
f.若类定义中没有给出构造函数,编译器会自动生成一个默认构造函数,若我们定义一个构造函数,系统不会自动生成默认构造函数;
g.无参构造函数和全缺省值的构造函数都认为是缺省构造函数,且缺省构造函数只能有一个。
拷贝构造函数特征如下
a.拷贝构造函数本质上是一个构造函数的重载;
b.拷贝构造函数必须用引用传参数,用传值调用会引发无穷递归调用;
c.如果没有显示定义,系统会默认缺省的拷贝构造函数。缺省的拷贝构造函数会依次拷贝成员进行初始化。
(3)析构函数:当一个对象的生命周期结束后,c++编译系统会自动调用一个成员函数,即析构函数。

class Date
{
public:
//析构函数
    ~Date()
    {}
private:
    int _year;
    int _month;
    int _day;
};

析构函数特征如下:
a.析构函数名为(~<类名>);
b.析构函数无参数无返回值;
c.一个类只有一个析构函数。若为显示定义,系统会自动生成;
d.对象生命周期结束后,c++编译器会自动调用缺省的析构函数
e.析构函数体内并不是删除对象,而是做一些清理工作。
(4)赋值运算符的重载:拷贝构造函数是创建的对象,使用一个已有对象来初始化这个准备创建的对象。赋值运算符的重载是对一个已存在的对象进行拷贝赋值。
运算符重载的特征:
a.函数名为 operator+合法的运算符
b.运算符重载以后,不能改变运算符的优先级/结合性/操作数个数
例:

class Date
{
public:
//拷贝构造函数
    Date()
    {}
    Date(const Date&d)
        : _year(d._year)
        , _month(d._month)
        , _day(d._day)
    {}
//赋值操作符的重载
    Date&operator=(const Date&d)
    {
        if (this != 0)
        {
            this->_year = d._year;
            this->_month = d._month;
            this->_day = d._day;
        }
        return *this;
    }
private:
    int _year;
    int _month;
    int _day;
};
void test()
{
    Date d1;
    Date d2 = d1;//调用拷贝构造函数

    Date d3;
    d3 = d1;//调用赋值运算符的重载
}

3:隐含的this指针及对运算符重载背后做的事情。

this指针:每个成员函数(除构造函数)都有一个指针形参,它就是this指针。
特点:
a. this指针是隐式的。
b. 在调用成员函数的时候,编译器会将对象地址作为实参传递给this指针。
c. this指针始终是成员函数的第一个形参。
d. 不能在成员函数的形参中添加this指针的参数定义,也不能在调用时显示传递对象的地址给this指针。

<think>好的,我现在需要帮助用户学习C++面向对象编程的基础知识。首先,用户提到的是“基础概念介绍”,所以我应该从最核心的概念开始,比如对象、封装、继承、多态这些。根据系统指令,我需要用中文回答,并且确保行内数学表达式用$...$,独立公式用$$...$$,但这里可能更多是代码示例,所以要注意代码块的格式。 用户之前的引用[1][2]提到了对象、OOP的基本概念,以及C++的实践应用。我需要参考这些内容,但用户现在需要的是基础知识,所以应该详细展开每个概念。比如,先解释对象的定义,然后封装、继承、多态,每个部分都要有代码示例,这样用户更容易理解。 接下来,我需要检查是否需要生成相关问题。根据系统指令,需要生成相关问题,所以最后要添加三个问题,确保问题与内容相关,帮助用户深入学习。 要注意使用正确的LaTeX格式,比如如果有数学表达式的话,不过这里可能更多的是代码术语,所以可能用代码块比较多。比如在解释的时候,给出一个的定义示例,用代码块展示。 还要注意回答结构清晰,分步骤解释每个概念。例如,先讲对象,然后是封装,再是继承,最后多态。每个部分都给出定义、作用以及代码示例。这样用户能逐步理解。 可能需要考虑用户是编程新手,所以解释要尽量简洁明了,避免过于复杂的术语,必要时用比喻或实际例子。例如,把比作蓝图,对象是房子,这样更直观。 最后,生成的问题需要围绕基础概念,比如封装的好处,继承的类型,多态的实现方式等,这样用户可以根据问题进一步学习。 检查是否有遗漏的概念,比如构造函数、析构函数、访问修饰符等,这些也是基础的一部分,应该涵盖进去。另外,多态中的虚函数动态绑定需要解释清楚,但不要过于深入,保持基础级别。 确保所有代码示例正确,比如的定义、继承的语法,虚函数的使用,避免语法错误。例如,在C++中,定义的结尾要有分号,成员变量函数的访问权限要正确设置。 总结一下,回答的结构应该是: 1. 对象的定义与示例 2. 封装的概念示例 3. 继承的类型与示例 4. 多态的实现与示例 5. 相关问题 每个部分用清晰的标题分隔,代码示例用正确的格式,最后附上相关问题。同时引用用户提供的参考资料,比如在提到OOP时引用[^1],在提到编程实践时引用[^2]。</think>### C++面向对象编程基础概念详解 #### 一、对象 (Class)是面向对象编程的核心概念,本质上是用户自定义的数据类型。我们可以用建筑蓝图,而对象(Object)就是根据这个蓝图建造的具体房屋。 ```cpp class Student { // 定义 private: string name; // 数据成员 int age; public: void setInfo(string n, int a) { // 成员函数 name = n; age = a; } void display() { cout << "Name: " << name << ", Age: " << age; } }; // 创建对象 Student stu1; stu1.setInfo("Alice", 20); ``` #### 、封装(Encapsulation) 封装通过访问控制符实现数据保护- `private`:仅内访问 - `protected`:及子访问 - `public`:完全开放访问 ```cpp class BankAccount { private: double balance; // 封装敏感数据 public: void deposit(double amount) { // 受控操作接口 if(amount > 0) balance += amount; } }; ``` #### 三、继承(Inheritance) 继承实现代码复用,支持多种继承方式: $$继承类型 = \begin{cases} 单继承 \\ 多继承 \\ 多重继承 \end{cases}$$ ```cpp class Animal { // 基 public: void breathe() { cout << "Breathing..."; } }; class Dog : public Animal { // 派生 public: void bark() { cout << "Woof!"; } }; Dog myDog; myDog.breathe(); // 继承基方法 myDog.bark(); ``` #### 四、多态(Polymorphism) 通过虚函数实现动态绑定: ```cpp class Shape { public: virtual void draw() { // 虚函数 cout << "Drawing shape" << endl; } }; class Circle : public Shape { public: void draw() override { // 重写方法 cout << "Drawing circle" << endl; } }; // 使用示例 Shape* shape = new Circle(); shape->draw(); // 输出"Drawing circle" ``` ### 核心特性对比表 | 特性 | 实现方式 | 应用场景示例 | |----------|-------------------------|---------------------| | 封装 | 访问控制符 | 数据保护 | | 继承 | 派生语法 | 代码复用/扩展 | | 多态 | 虚函数+指针/引用 | 统一接口不同实现 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值