[C++学习日记]-09-类和对象

♀尐吖头ヾ 提交于 2020-01-25 07:01:52

类和对象


对象

什么是对象

面向对象编程(Object Oriented Programming)是一种编程风格,旨在让思维编程更接近思考现实世界。

在编程世界里,对象是独立单元,每一个都有自己的身份,像真实世界那样,像苹果,马克杯等等,每一个都有独一无二的 identity (身份)。

有两个一模一样的水杯,但是他们仍然是分开的两个独立个体。

对象用属性来描述它们的特征。例如,一辆车可以是红色或蓝色,一个杯子可以是满的或空的,等等。

一个属性描述了一个对象的当前状态。

对象可以有多个属性(马克杯可以是空的,红色的和大的)。

对象的状态与其类型无关;比如:一个杯可能充满水,另一个杯可能是空的。

如何区分对象

在现实世界中,每个对象都以自己的方式行事。汽车是移动,电话是铃响,等等。这同样适用于对象。

所以对象的类型有三个维度表示,identity(标识),attributes(属性),behavior(行为)
在编程中,一个对象是独立的,有自己的身份(标识)。它与其他对象是分开的。

每个对象都有自己的属性,描述了它的当前状态。每个对象都展示自己的行为,这表明他们可以做什么。

在这里插入图片描述

在编程中,对象并不总是代表物理项目。

例如,一个编程对象可以代表日期,时间,银行账户。银行账户不是有形的;你看不见它或者触摸它,但它仍然是一个明确的对象 - 它有自己的身份,属性和行为。


什么是类

对象是使用类来创建的,而这些类实际上是 OOP(面向对象编程) 的焦点。

这个类描述了这个对象是什么,但是和对象本身是分开的。

换句话说,一个类可以被描述为一个对象的蓝图,描述或定义。

您可以使用相同的类作为创建多个不同对象的蓝图。

例如,为了创建新的建筑,建筑师创建了一个蓝图,作为实际建筑结构的基础。同样的蓝图可以用来创建多个建筑物。

编程以相同的方式工作。我们首先定义一个类,它成为创建对象的蓝图。

每个类都有一个名称,并描述了属性和行为。

在编程中,type 类型用于引用类名:我们正在创建一个特定类型的对象。

属性也被称为属性或数据。


方法

方法是类 行为 的另一个术语。一个方法基本上是一个属于一个类的函数。

方法类似于函数 - 它们是被调用的代码块,也可以执行操作并返回值。


一个类的例子

例如,如果我们正在创建一个银行项目,我们可以给我们的类以下特征:

名称:BankAccount

属性:accountNumber,余额: dateOpened

行为:open(), close(), deposit()

该类指定每个对象应具有已定义的属性和行为。但是,它没有指定实际的数据是什么;它只提供一个定义。

一旦我们编写了这个类,我们就可以继续创建基于这个类的对象。

每个对象被称为一个类的实例。创建对象的过程称为实例化。

每个对象都有自己的身份(标识),数据(属性)和行为。


访问修饰符

访问说明符用于为特定成员设置访问级别。
访问说明符的三个级别是 public, protected, 和 private.
一个 public 成员可以从类以外的任何地方访问,也可以在类对象的范围内的任何地方访问。

class 类名{

  private: 
  	私有数据成员和成员函数
  	//一般只有本类的成员函数及友元函数访问,不能被类以外或者其他类访问
  protected:
  	受保护的数据成员和成员函数	
  	//这些成员智能被本类函数、派生类(子类)函数、和友元函数访问
  public:
    共有数据成员和成员函数
    //可以被本程序任何函数访问
};


访问修饰符只需要声明一次; 多个成员可以遵循单个访问修饰符。注意 public 关键字后面的冒号


把访问说明符放在一起:
#include <iostream>
#include <string>
using namespace std;

class myClass {
  public:
    void setName(string x) {
      name = x;
    }
    string getName() {
      return name;
    }
  private:
    string name;
};

int main() {
  myClass myObj;
  myObj.setName("Loen");
  cout << myObj.getName();

  return 0;
}

//输出 "Loen"

我们使用封装来隐藏来自外部代码的名称属性。然后我们使用公共方法提供访问权限。我们的类数据只能通过这些方法读取和修改。

这样允许更改方法和属性的实现,而不会影响外部代码。


声明一个类

用关键字 class 定义类。按照带有类名和类体的关键字,用一组大括号(花括号)括起来。

以下代码声明了一个名为 BankAccount 的类:

class BankAccount {
  public:
    void sayHi() {
      cout << "Hi,OOP" << endl;
    }
};

一个类的定义必须跟一个分号。在大括号内定义类的所有属性和行为(或成员)。
 
您还可以为类的成员定义访问说明符。
已经使用 public 关键字定义的成员可以从类外部访问,只要它在类对象范围内的任何位置。
你也可以指定一个类的成员为 private 或 protected 的。


下一步是实例化我们的 BankAccount 类的一个对象,就像我们定义一个类型的变量一样,区别在于我们的对象的类型是 BankAccount。

int main() 
{
  BankAccount icbc;
  icbc.sayHi();
}

//输出 Hi,OOP

我们的名为 icbc的对象已经拥有了所有类的成员。

在这里

  • icbc是一个对象,它属于BankAccount 类
  • 如果创建一个abc 那么它也是一个对象 它也属于BankAccount 类

注意用于访问和调用对象的方法的点分隔符 . (英文点符号)

我们必须在使用它之前声明一个类,就像我们对函数做的一样。


类和对象的关系

在生活中例如 猫科动物

我们可以划分一个猫科动物类

那么

家猫 属于 猫科动物

老虎也属于猫科动物

他们都是 对象 而且都属于 猫科动物

我们称 猫和老虎对象

猫科动物就是


构造函数

类构造函数是类的特殊成员函数。无论何时在该类中创建新对象,都会执行它们。

无参构造

构造函数的名称与该类的名称完全相同。它没有返回类型,甚至 void 类型。

class myClass {
  public:
    myClass() { //这里是构造函数,只要创建对象这里的代码就会执行
      cout <<"Loen";
    }
    void setName(string x) {
      name = x;
    }
    string getName() {
      return name;
    }
  private:
    string name;
};

int main() {
  myClass myObj;

  return 0;
}

//输出 "Loen"

在创建一个 myClass 类型的对象时,构造函数会自动调用。

有参构造

创建对象时,您现在需要传递构造函数的参数,就像调用函数时一样:

class myClass {
  public:
    myClass(string nm) {
      setName(nm);
    }
    void setName(string x) {
      name = x;
    }
    string getName() {
      return name;
    }
  private:
    string name;
};

int main() {
  myClass ob1("eeedong");
  myClass ob2("Amy");
  cout << ob1.getName();
}
//输出 "eeedong"

我们定义了两个对象,并使用构造函数传递每个对象的 name 属性的初始值。

可能有多个构造函数他们有不同数量的参数。


析构函数

析构函数的名字将与该类完全相同,只是有前缀(~)。析构函数不能返回值或取任何参数。

class MyClass {
  public: 
    MyClass() {//构造函数
     //这里的代码在创建对象时候自动执行
     // some code
    }
    ~MyClass() {//析构函数
     //这里的代码在销毁对象时候自动执行
     // some code
    }
};

析构函数在退出程序之前可以非常有用地释放资源。这可以包括关闭文件,释放内存等等。

delete 变量名; 进行销毁


选择操作符

使用对象时,使用点成员选择操作符(.)。

int main() {
	MyClass obj;
	MyClass *ptr = &obj;
	ptr->myPrint();
}

使用指向对象的指针时,请使用箭头成员选择操作符( ->)。

int main() {
  MyClass obj;
  obj.myPrint();
}

综合案例

#include <iostream>
#include <string>
using namespace std;

class BankAccount {
public:
	BankAccount(string s) { //构造函数
		name = s;
		cout << "创建了一个" << getName() << endl;
	}

	~BankAccount() {//析构函数
		cout << getName()<< "倒闭了" << endl;
	}
	
	string getName() {//返回name的值
		return name;
	}
	void sayHi() { //打招呼
		cout << "Hi I'm" << getName() << endl;
	}

private:
	//设置name
	void setName(string x) {
		name = x;
	}

	string name;
};
int main()
{
	BankAccount test = BankAccount("交通银行");//使用变量创建对象

	test.sayHi();//变量使用点操作
	
	BankAccount *p = new BankAccount("建设银行");//使用指针创建对象

	p->sayHi();//指针使用箭头

	delete p; //释放内存
}

输出结果:

创建了一个交通银行
Hi I'm交通银行
创建了一个建设银行
Hi I'm建设银行
建设银行倒闭了

小练习

1.请举例生活中常见的类和对象,并且说明他们的关系

2.创建一个猫科动物类(构造方法提供名称和叫的方式两个参数),并且声明一个猫(喵喵叫)和一个老虎(怒吼叫)两个对象

如果你有兴趣的话,欢迎把你的答案在评论区中发表


上一篇[C++学习日记]-08-函数

下一篇[C++学习日记]-10-对象的使用

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!