Skip to content

类和对象

1.基本概念

类:具有相同特性和行为的对象组成的集合就是类

对象:万物皆对象。它包括现实中客观存在的事物,也包括抽象的时间、规则、思维。简单点说,对象具有状态、行为和标识。

2.类与对象的关系

类是对象的抽象,而对象是类的具体实例。类与对象的关系:抽象(该抽象是名词)与类的实例化就是对象,对象的共性特征抽象(该抽象是动词)出来就是类。

3.类的创建

3.1 语法

通过class语法声明一个类,可以在类中创建任意数据,以及方法,类名的首字母一般大写

  • 在类中定义成员时,可以声明并赋上初始值,也可以只声明
c++
class 类名{
public:
    修饰符 变量名 = 值;
    修饰符 变量名1 = 值1;
        
    返回值 方法名(){
        // 函数体
    }
    // ..
};

3.2 浅谈访问权限

访问权限用来修饰属性、行为在某些位置是否可以访问,成员和类的默认访问修饰符是 private

  • public公开权限,可以在任意位置访问
  • private私有权限,只有在当前类中可以访问,其他位置都不可
  • protected保护权限,可以在当前类和子类中访问,类外不可访问
c++
class Base {
    public:
    // 公有成员
    
    protected:
    // 受保护成员
    
    private:
    // 私有成员
};

3.2 例子

我们创建一个例子方便下面使用

c++
#include<iostream>
using namespace std;

class Person {
public:
	int age;
	string name;
	string sex;
	void eat() {
		cout << "吃饭" << endl;
	}
	void speak(string words) {
		cout << name << "说:" << words << endl;
	}
};

int main() {}

4.对象的创建

4.1 语法

对象的创建有两种方式

4.1.1 在栈中开辟空间

c++
Person p1 = Person()
// 等价于
Person p1;

TIP

Person p1 = Person()的语法涉及到构造函数,以及构造函数的传参,下面会说到

4.1.2 在堆中开辟空间

c++
Person* p1 = new Person()

4.1.3 区别

不用new使用new
内存方面中开辟中开辟
内存管理不需要收到销毁需要手动使用delete销毁
属性初始化没有初始值自动有默认的初始值
语法不需要使用*需要使用指针*来接受变量
成员访问通过.访问通过->访问

注意

创建对象的时候,需要在内存中开辟空间

  • 若类中是有属性的,那么这个对象所占空间大小,等于所有属性占用空间的和
  • 若类中没有属性,那么这个对象所占空间大小为1

如下图,类中包含两个int类型数据,所以对象占用4字节

image-20240717160738095

若类中没属性,则对象占用空间为1

image-20240717160829734

5.成员访问

成员访问就是我们去访问类中的属性、方法

5.1 栈中对象的访问

通过对象名.属性/方法()去访问对象中的属性或者方法,也可以进行更改

c++
#include<iostream>
using namespace std;

// 定义类
class Person {
public:
	int age;
	string name;
	string sex;
	void eat() {
		cout << "吃饭" << endl;
	}
	void speak(string words) {
		cout << name << "说:" << words << endl;
	}
};

int main() {
	Person p1 = Person();
	p1.age = 18;
	p1.name = "xiazhi";
	p1.sex = "男";

	cout << p1.age <<endl;		// 18
	cout << p1.name <<endl;		// xiazhi
	cout << p1.sex <<endl;		// 男

	p1.eat();					// 吃饭
	p1.speak("我要学C嘎嘎");	// xiazhi说:我要学C嘎嘎
}

5.2 堆中对象的访问

通过通过对象名->属性/方法()去访问对象中的属性或者方法,也可以进行更改

c++
#include<iostream>
using namespace std;

// 定义类
class Person {
public:
	int age;
	string name;
	string sex;
	void eat() {
		cout << "吃饭" << endl;
	}
	void speak(string words) {
		cout << name << "说:" << words << endl;
	}
};

int main() {
	Person* p1 = new Person();
	p1->age = 18;
	p1->name = "xiazhi";
	p1->sex = "男";

	cout << p1->age <<endl;		// 18
	cout << p1->name <<endl;		// xiazhi
	cout << p1->sex <<endl;		// 男

	p1->eat();					// 吃饭
	p1->speak("我要学C嘎嘎");	// xiazhi说:我要学C嘎嘎
}

TIP

因为通过new去定义对象时,对象变量是个指针,那么我们可以通过指针找到对象的堆地址

image-20240717162827368

那么我们就可以通过*访问该对象的堆空间,从而可以通过.的方式访问对象的数据

image-20240717163108332

但是这样的语法不方便,为了方便,我们通常使用->访问对象数据

6.类是一种自定义数据类型

之前当我们定义一个数据时,语法如下

c++
int num = 666;

当创建一个对象时

c++
Person p1 = Person();

这看起来语法类似,从而可以看出,Person是一种数据类型,而且是一种自定义数据类型

因此,我们可以在一个类中使用别的类

c++
#include<iostream>
using namespace std;

class Dog {
public:
	string name;
	string cate;
};

class Person {
public:
	int age;
	string name;
	string sex;
	Dog dog;
	Dog* dog2 = new Dog();
};

int main() {
	Person p1;
	p1.dog.name = "小不点";

	cout << p1.dog.name << endl;  // 小不点

	p1.dog2->name = "大黄";
	cout << p1.dog2->name << endl;  // 大黄
}

MIT Licensed