类和对象
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字节

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

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去定义对象时,对象变量是个指针,那么我们可以通过指针找到对象的堆地址

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

但是这样的语法不方便,为了方便,我们通常使用->访问对象数据
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; // 大黄
}