zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    能量石
    Journey among Railway Stations —— 1J
    金明的预算方案
    css学习
    实验七
    计算圆的面积和窗体的跳转
    Android子菜单和选项菜单与上下文菜单的实现
    Android 对话框(Dialog)
    /etc/init.d 与 service 的 关系 。。。。。。。
    Linux && Aix 下 常用命令 dd
  • 原文地址:https://www.cnblogs.com/KX-Lau/p/12822971.html
Copyright © 2011-2022 走看看