码迷,mamicode.com
首页 > 编程语言 > 详细

C++---面向对象

时间:2020-05-03 20:55:09      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:清理   ble   关键字   方式   core   中心   public   括号   指针   

面向对象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;
}

C++---面向对象

标签:清理   ble   关键字   方式   core   中心   public   括号   指针   

原文地址:https://www.cnblogs.com/KX-Lau/p/12822971.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!