类和对象的创建和实例化

1. 类的概述

1.1 具体示例

cpp 复制代码
	类是描述一类事物的特征和行为的统称,抽象的不存在的,泛指的概念,例如:描述一个人,从外观上(特征)和言行举止(行为)上进行描述
	外观上(特征):
		长头发
		蓝牙眼睛
		白皮肤
		带了美瞳
		年龄多大
		身高
		体重
		.....
	言行举止(行为):
		走路
		跑步
		说话
		学习
		打游戏
		.......

1.2 对象

是指类的实例化(实实在在存在的),是特指的概念,例如:人类实例化对象张三、李四、王二等等

1.3 程序来描述

cpp 复制代码
关键字:class   -------描述一个类
格式:
	class    类名
	{
		//外观---特征
		长头发
		蓝牙眼睛
		白皮肤
		带了美瞳
		年龄多大
		身高
		体重
		.....
		//言行举止----行为
		走路
		跑步
		说话
		学习
		打游戏
		.......
	};

例如:
	class   People
	{
		//特征
		int  eyes;
		int age;
		int height;
		int weight;
		char name[20];
		.....
		//行为
		void walk()
		{}
		void run()
		{}
		void play()
		{}
		void study()
		{}
		..........
	};

特征(属性):

指的是变量,称为类的成员变量

行为(方法):

指的是函数,称为类的成员函数

类的成员:

包含了成员变量和成员函数

1.4 创建类

1.4.1 第一种方式,直接在主程序文件中创建类

main.c
cpp 复制代码
#include "iostream"
using namespace std;

//第一种方式,直接在主程序文件中创建类
class People1
{
	int age;//年龄
	int height;//身高
	char name[20];//姓名
	//函数的实现第一种方式:在类中实现函数
	void walk()//走路的行为
	{
		cout << "走路" << endl;
	}
	void play()//玩的行为
	{
		cout << "玩耍" << endl;
	}
	void study();//学习
};
//函数的实现第二种方式:在类外实现函数
/*
格式:
	函数返回值类型    类名  ::函数名(参数列表)
	{
		//代码
	}
*/

void People1::study()
{
	cout << "学习" << endl;
}


int main()
{

	return 0;
}

1.4.2 分模块创建

People2.h
cpp 复制代码
#pragma once
#include "iostream"
using namespace std;

class People2
{
	int age;
	int height;
	char name[20];

	void walk()
	{
		cout << "走路" << endl;
	}
	void study()
	{
		cout << "学习" << endl;
	}

	//这个函数的实现我们换一种方式实现,我们放在people2.cpp中实现
	void play_game();


};
People2.cpp
cpp 复制代码
#include "People2.h"
/*
格式:
	函数返回值类型    类名  ::函数名(参数列表)
	{
		//代码
	}
*/
void  People2::play_game()
{
	cout << "玩游戏" << endl;
}

2. 实例化的两种方式

是指类的实例化(实实在在存在的),是特指的概念,例如:人类实例化对象张三、李四、王二等等

实例化的两种方式:

2.1 在栈区进行实例化

格式:

类名对象名; //类名和对象名就是标识符, 满足语法规范

例如:

People zhangsan ; //实例化zhangsan对象

People lisi;

2.1.1 通过类的对象去进行访问

(1)对象是在栈区实例化

符号:"."

格式:

对象名 . 成员 ; //访问类的成员

例如:

zhangsan.height=180;

zhangsan.walk();

main.cpp
cpp 复制代码
#include "iostream"
using namespace std;

//类和对象实例化

//第一种方式,直接在主程序文件中创建类
class People1
{
public:
	int age;//年龄
	int height;//身高
	char name[20];//姓名
	//函数的实现第一种方式:在类中实现函数
	void walk()//走路的行为
	{
		cout << "走路" << endl;
	}
	void play()//玩的行为
	{
		cout << "玩耍" << endl;
	}
	void study();//学习
};
//函数的实现第二种方式:在类外实现函数
/*
格式:
	函数返回值类型    类名  ::函数名(参数列表)
	{
		//代码
	}
*/

void People1::study()
{
	cout << "学习" << endl;
}


int main()
{
	//第一种 实例化一个People1
	People1 people1;
	people1.walk();
	people1.play();
	people1.study();
	cout << endl;

	//第二种 实例化一个People1
	People1* people2 = new People1;
	people2->walk();
	people2->play();
	people2->study();


	return 0;
}

2.2 在堆区进行实例化

格式: .

类名 * 对象名 = new 类名; //在堆区开辟类大小的空间,并用对象指向该空间

People* zhangsan = new People //注意释放空间:delete zhangsan

2.2.1 如何访问类的成员

(2)对象是在堆区实例化

符号:"->"

格式:

对象名 -> 成员 ;//访问类的成员

例如:

zhangsan->height=180;

zhangsan->walk();

main.cpp
cpp 复制代码
//第二种 实例化一个People1
	People1* people2 = new People1;
	people2->walk();
	people2->play();
	people2->study();
cpp 复制代码
#include <iostream>
using namespace std;

class MyClass {
public:
    MyClass() {
        // 无参构造函数的实现
    }

    void setValue(int value) {
        data = value;
    }

    void display() {
        cout << "Value: " << data << endl;
    }


    int data;
};

int main() {
    // 在堆上创建对象
    MyClass* ptr = new MyClass();

    // 为成员变量赋值
    ptr->setValue(42);
    ptr->display();
    ptr->data = 50;
    ptr->display();

    // 释放对象所占用的内存
    delete ptr;

    return 0;
}

2.3 面试题:结构体和类的区别是什么?

仅供参考

  1. 默认访问权限:

在结构体中,默认的成员访问权限是公共的(public)。

在类中,默认的成员访问权限是私有的(private)。

  1. 成员函数:

在结构体中,你可以包含成员函数,但这些函数默认是公共的。

在类中,你可以有公共、私有和受保护的成员函数,具体取决于你在类定义中的声明。

  1. 继承:

在结构体中,可以进行继承,但默认继承权限是公共的。

在类中,可以进行公共、私有和受保护的继承,具体取决于你在类定义中的声明。

  1. 默认构造函数:

在结构体中,如果没有提供构造函数,会有一个默认的构造函数。

在类中,如果没有提供构造函数,也会有一个默认的构造函数,但是如果你提供了自定义构造函数,那么默认构造函数就不再提供。

相关推荐
呆呆的猫10 分钟前
【LeetCode】227、基本计算器 II
算法·leetcode·职场和发展
Tisfy12 分钟前
LeetCode 1705.吃苹果的最大数目:贪心(优先队列) - 清晰题解
算法·leetcode·优先队列·贪心·
余额不足1213832 分钟前
C语言基础十六:枚举、c语言中文件的读写操作
linux·c语言·算法
ragnwang1 小时前
C++ Eigen常见的高级用法 [学习笔记]
c++·笔记·学习
罗伯特祥2 小时前
C调用gnuplot绘图的方法
c语言·plot
嵌入式科普3 小时前
嵌入式科普(24)从SPI和CAN通信重新理解“全双工”
c语言·stm32·can·spi·全双工·ra6m5
火星机器人life3 小时前
基于ceres优化的3d激光雷达开源算法
算法·3d
虽千万人 吾往矣3 小时前
golang LeetCode 热题 100(动态规划)-更新中
算法·leetcode·动态规划
arnold664 小时前
华为OD E卷(100分)34-转盘寿司
算法·华为od
ZZTC4 小时前
Floyd算法及其扩展应用
算法