C++类和对象基础知识

C++类和对象系列文章目录

提示:C++类和对象的基础知识点,后续再补充



1.1C和C++中的结构体struct

在 C 语言中,结构体主要用于定义数据类型,主要用来组合不同类型的变量。然而,在 C++ 中,结构体的功能得到了扩展,不仅可以定义变量,还可以定义成员函数。因此,C++ 中的结构体实际上可以视为一种特殊的类。

C vs C++ 中的结构体

  • C 语言

    • 结构体只能用于定义数据类型和变量。
    • 结构体的功能相对简单,主要用于数据的组合。
  • C++ 语言

    • 结构体可以定义变量和成员函数。
    • 支持访问修饰符(如 publicprivate),使得结构体的封装性更强。
    • 可以进行继承和多态,进一步增强了其功能。

因此,虽然 C++ 中的结构体在某些方面与类相似,但由于它们在默认访问控制和用途上的一些区别,仍然可以将其称为结构体。

struct Student
{
   
	void SteStudentInfo(const char* name,const char* gender,int age)
	{
   
		strcpy(_name,name);
		strcpy(_gender,gender);
		_age = age;
	}
	void printStudentInfo()
	{
   
		cout<<_name<<" "<<_gender<<" "<<_age<<endl;
	}
	char _name[20];
	char _gender[3];
	int _age;
}

虽然结构体和类在功能上有很多相似之处,但 C++ 专门定义了 class 来实现面向对象编程,以提供更严格的封装和访问控制。这使得开发者可以更好地管理数据和功能,促进代码的重用和维护。

1.2 类声明和变量分离

person.h 文件中
class Person
{
   
	public:
		void ShowInfo();
	private:
		char* _name;
		char* _sex;
		int _age;
}
person.cpp文件中
#inclde "person.h"
void Person::showInfo()
{
   
	cout<<_name<<"_"<<_sex<<"_"<<_age<<_endl;
}

1.3 类的封装

public(公有) 类外也可以访问
protected(保护)和private(私有)类外无法访问

class默认访问权限:私有 private
struct默认访问权限:共有 public 兼容C

1.4 类外使用成员函数 在类外使用::作用域解析符来指明成员属于哪个类

class Person
{
   
	public:
		void ShowInfo();
	private:
		char* _name;
		char* _sex;
		int _age;
}void Person::showInfo()  //成员函数类外需要指明所属类
{
   
	cout<<_name<<"_"<<_sex<<"_"<<_age<<_endl;
}

1.5 声明和定义的拓展

声明是一种承诺,其不分配空间;
定义是对象的实例化,分配空间;
声明可以多次,但是定义只能一次
声明可以在多个源文件中,通过#ifndef来解决,而定义只能在一个源文件中。

1.定义的情况
万物皆可以对象
类名 对象名;(数据类型 变量) +函数定义

```cpp
int x;  //变量定义 分配空间
Person p; //对象定义  分配空间

int Add(int x,int y)  //函数定义 分配栈空间
{
   
	return x+y;
}
1.声明的情况
extern int x;
(extern) int Add(intx,int y);

1.6 对象中只会存储成员变量,而不会存储成员函数。why?

在 C++ 中,一个类可以实例化出多个对象,这些对象的成员函数相同,但它们的成员变量值各异。为了节省空间,成员变量存储在每个对象实例中,而成员函数则存储在公共代码区中。
注意:如果一个空对象有一个字节的空间,why,占位,方便取地址。

1.7 类对象中隐含的this指针

1.this指针指向 谁调用指向谁, this指针是类中的成员函数的第一个参数
2.this指针不能为空,空的this,会导致 this->变量是报错

class Date
{
   
publicvoid Init(int year,int month,int day)
	{
   
		_year = year;
		_month =month;
		_day = day; 
	}
	>>>>>>>>>>>>>>>>编译器编译为>>>>>>>>>>>>>>>>>>
	void Init(Data* this,int year,int month,int day)
	{
   
		this->_year = year;
		this->_month =month;
		this->_day = day; 
	}
	>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	private:
	int _year;
	int _month;
	int _day;
};
int mian()
{
   
	Date d1;
	d1.Init(2020,4,7)//
	>>>>>>>>>>>>>>>>编译器编译为>>>>>>>>>>>>>>>>>>
	d1.Init(&d1,2020,4,7);
	>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
}

1.8 构造函数:初始化对象

1.函数名和类名一样
2.无返回值
3.对象实例化时自动调用
4.构造函数可以重载
5.如果未定义构造函数,编译器会自动生成一个无参的默认构造函数
6.默认的析构在定义对象 会随机初始化内置类型的值
对于自定义类型 会调用对于的构造函数

class Time
{
   
	public: 
	Time() //构造函数   函数名和类名一样  无返回值
	{
   
		_hour = 0;
		_minute = 0;
		_second =0;
	}
	private:
	int _hour;
	int _minute;
	int _second;
};

class Date
{
   
	void Print()
	{
   
		cout<<_year<<"_"<<_month<<"_"<<_day<<endl;
	}</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值