C++—面向对象

面向对象oop

  • 面向对象, 是基于对象的概念, 以对象为中心, 以类和继承为构造机制, 来刻画客观世界, 模拟现实.
  • 对象是由数据和容许的操作组成的封装体, 与客观实体有直接的对应关系
  • 面向对象不是某一种语言的特性, 而不是一种编程思想
  • 面向对象首先考虑数据, 不仅考虑如何表示这些数据, 还要考虑如何使用数据

类和对象

  • 类是一种将抽象转换为用户定义类型的工具
  • 将数据表示和操纵数据的方法组成一个整体
  • 类的实例成为对象
  • 类中的变量和函数成为成员

类的声明

  • 使用class/struct关键字声明类型
  • class方式声明的类型与struct声明的类型除了形式上的不同, 其区别还在于使用class声明的类型默认成员是私有的(private), 而struct声明的类型默认成员是公有的(public)
//LandOwner.h中
class LandOwner {
    public: 
        LandOwner();              //默认构造函数
        ~LandOwner();             //默认析构函数
        string name;
        long score;
        int cards[20];

        void TouchCard(int);   //摸牌
        bool PlayCard(int);    //出牌
        void ShowScore();         //查看积分
}

//LandOwner.cpp中
LandOwner::LandOwner()
{

}

void LandOwner::TouchCard(int cardCount)
{
    cout << "摸牌" << cardCount << endl;
}

LandOwner::~LandOwner()
{

}

创建对象

  • 第一种实例化方式---在栈内存中创建, 类似声明变量

    类型  对象名(参数列表);
    Student stu();
    Student stu;
    
    • stu对象由系统创建并释放, 不用担心内存泄漏
    • 生命周期只在声明区域的大括号内
    • 栈内存的优势是存取速度比较快, 缺点是存在栈中的数据大小与生存期必须是确定的, 缺乏灵活性
  • 第二种实例化方式---在堆内存中创建, 使用new关键字

    Student* p_stu1 = new Student();
    Student* p_stu2 = new Student;
    auto* p_stu3 = new Student();
    
    • 需要使用delete释放
    • 使用灵活, 可以赋值给全局变量, 可以把对象作为函数的返回值返回

类的成员变量

//函数声明
class 类名 {
    修饰符1: 
        变量类型 变量名;
    修饰符2:
        函数返回类型  函数名();

}

class LandOwner {
    public:
        string name;
        long socre;
    public:
        void ShowScore();
}

//函数定义
//:: 作用域解析运算符
返回类型 类名::函数名()
{
    //函数操作
}

void LandOwner::ShowScore()
{

}

访问修饰符

  • public: 修饰的成员在任意地方都可以访问
  • private: 修饰的成员只能够在类中或友元函数中访问
  • protected: 修饰的成员可以在类中函数, 子类函数及友元函数中访问

构造与析构函数

构造函数

  • 以类名作为函数名, 无返回值类型
  • 初始化对象的数据成员, 类对象被创建时, 编译器为对象分配内存空间, 并自动调用构造函数以完成成员的初始化
  • 构造函数的种类: 无参构造, 一般构造(重载构造), 拷贝构造
  • 如果创建的类中未书写任何构造函数, 系统会自动生成默认的无参构造函数
  • 如果书写了构造函数, 系统就不会再自动生成默认构造; 如果希望有一个无参构造函数, 需要自己显示地书写出来
类名::构造(类型 参数)
{
    //相关初始化代码
}

Student::Student(string name, string desc)
{
    m_name = name;
    m_desc = desc;
}

//可以简写
Student::Student(string name, string desc) : m_name(name), m_desc(desc)
{

}

Student* stu = new Student("大白", "超能陆战队");

析构函数

  • 对象过期时自动调用的特殊成员函数
  • 析构函数一般用来完成清理工作
  • 析构函数的名称是在类名前加~
  • 析构函数没有参数, 且只能有一个
  • 析构函数用来释放对象使用的资源, 并销毁对象的非static数据成员
  • 无论何时一个对象被销毁, 都会自动调用其析构函数
class Student {
    private:
        double* scores;
    public: 
        Student(int len)
        {
            //分配资源
            scores = new double[len];
        }
        ~Student()
        {
            //释放资源
            delete scores;
        }
}

this指针

  • 每个成员函数, 包括构造和析构函数, 都有一个this指针
  • this指针指向调用对象, 即可以通过this关键字访问当前对象的成员
  • this指针类型为类名* const, 为右值
  • this指针本身不占用大小, 它并不是对象的一部分, 因此不会影响sizeof的结果
  • this的作用域在类成员函数的内部
  • this指针是类成员函数的第一个默认隐含参数, 编译器会自动维护传递, 类编写者不能显式传递
  • 只有在类的非静态成员函数中才可以使用this指针, 其他任何函数都不可以
  • this指针可以用来返回当前对象的引用
//访问成员变量
this->成员名;

//访问成员函数
this->函数名();

class Student {
    public:     
        Student& addScore(int score);
}

Student& Student::addScore(int score){
    this->score =  this->score + score;
    return *this;
}

原文链接: https://www.cnblogs.com/KX-Lau/p/12822971.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++---面向对象

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/345940

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午3:33
下一篇 2023年3月2日 上午3:33

相关推荐