【C++基础(五)】类和对象(上)

这篇具有很好参考价值的文章主要介绍了【C++基础(五)】类和对象(上)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:C++初阶之路⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学习C++
  🔝🔝


【C++基础(五)】类和对象(上),C++初阶之路,c++,开发语言

1. 前言

C语言是面向过程的语言
关注的是过程
而C++是面向对象的语言
关注的是对象

而类和对象就是面向对象的基础!

【C++基础(五)】类和对象(上),C++初阶之路,c++,开发语言

C++为了兼容C语言
保留了原先的玩法,并且增加了新的玩法

本章重点:

本篇文章着重讲解类的概念,基本特性
成员函数的性质,和最重要的this指针


2. 类的引入

C语言的结构体功能单一
只能定义成员变量,不能定义函数
而C++中新增了一个玩法:
可以定义成员函数

比如:

struct NEO
{
	int a;
	char b[20];
	void test()//成员函数
	{
		cout<<"杭州电子科技大学"<< endl;
	}
	void push(char ch,int i)//成员函数
	{
		b[i] = ch;
	}
};

int main()
{
	NEO tmp;
	tmp.test();//会打印"杭州电子科技大学"
	tmp.push('a',1);//数组b下标为1的位置会被插入一个字符'a'
}

在C++中,C的结构体就是类
并且C++中更喜欢用class替代struct


3. 类的定义

class className
{
	// 类体:由成员函数和成员变量组成
};   一定要注意后面的分号

类的定义与结构体类似
只不过将struct换成了class

类成员函数的两种定义方式:

  1. 声明和定义都放在类中:
class people
{
	char* name;
	char* sex;
	int height;
	int age;
	void peoinfo()//打印此人的消息
	{
		cout<<name<<" "<<sex<<" "<<height<<" "<<age;
	}
};

这个类的成员函数的声明和定义都在类中
编译器就可能把此函数当作内联处理!
只要是在类中定义的函数都会被看作内联

当然这只是给编译器一建议
具体会不会内当作内联要看代码长度

  1. 类函数声明定义分开

一般说的声明和定义分开是指:
声明放在.h文件,定义放在.cpp文件

.h文件

class people
{
	char* name;
	char* sex;
	int height;
	int age;
	void peoinfo()//打印此人的消息
};

.cpp文件(错误实例)

void peoinfo()//打印此人的消息
	{
		cout<<name<<" "<<sex<<" "<<height<<" "<<age;
	}

注意:在另一个文件中,必须要加上类名::
否则系统不知道你是要新定义一个函数
还是要定义已经声明过的函数

正解:

void people::peoinfo()//打印此人的消息
	{
		cout<<name<<" "<<sex<<" "<<height<<" "<<age;
	}

4. 类的访问限定符

首先介绍三个访问限定符:

【C++基础(五)】类和对象(上),C++初阶之路,c++,开发语言

访问限定符说明:

  1. public修饰的成员在类外
    可以直接被访问

  2. protected和private修饰的成员
    在类外不能直接被访问

  3. 访问权限作用域:
    从该访问限定符出现的位置开始直到
    下一个访问限定符出现时为止

  4. 如果后面没有访问限定符了
    作用域就一直到类结束

  5. class的默认访问权限为private
    struct为public(因为要兼容C)

举例说明:文章来源地址https://www.toymoban.com/news/detail-600200.html

class NEO
{
public:
	void test1()
	{
		cout<<"haha";
	}

	void test2()
	{
		cout<<"hehe";
	}

private:
	int a;
	char b[20];
	double c;
}

int main()
{
	NEO tmp;
	tmp.test1();//正常运行
	tmp.a = 10;//运行报错
	tmp.c = 20;//运行报错
	return 0;
}

此类中,public和private
之间的成员是共有的,类外可以访问
private到类结束的成员是私有的
类外不能访问!

需要注意的点:

不管成员函数是共有还是私有
也不管成员变量是共有还是私有
成员函数都可以访问到成员变量!


5. 类的实例化

用类类型创建对象的过程,称为类的实例化

在实例化类对象之前,这个类并不占用内存

比如:

class Person
{
public:
	void printper()
	{
		cout<<name;
	}
private:
	char* name;
};

int main()
{
	Person.name = "NEO";//编译报错,还没有实例化对象
	Person p1;
	return 0;
}

若没有实例化对象p1
这个class类是不会开辟空间的!

class类就像一个设计图纸一样
在按照这个图纸建设房子前
这块区域是没有空间占用的
实例化对象就像按照图纸修房子一样
会占用空间

【C++基础(五)】类和对象(上),C++初阶之路,c++,开发语言


6. 类对象模型

怎么计算一个class类的大小?

例如:下面这两个类:

class A
{
	void PrintA()
	{
		cout << a << endl;
	}
	int a;
	char b;
};

class B
{
	int a;
	char b;
};

int main()
{
	printf("类A的大小: %d\n", sizeof(A));
	printf("类B的大小: %d\n", sizeof(B));
	return 0;
}

【C++基础(五)】类和对象(上),C++初阶之路,c++,开发语言

结论:

  1. 类中的成员函数不算在类的大小中
  2. 类的大小遵守结构体内存对齐规则
  3. 空类(没有成员变量)的大小是1字节

注:如果你不知道结构体内存对齐规则
请点击:结构体内存对齐规则


6.1 类对象的存储模式

为啥类中的成员函数不占空间?
那函数存储在什么位置?

带着这样的疑惑来看看类的存储模式:

  • 类成员变量存储在实例化对象中
  • 类成员函数存储在公共的代码段

可以用下面这张图来理解:

【C++基础(五)】类和对象(上),C++初阶之路,c++,开发语言

对类成员变量的解释:

由于每一个对象中的变量的值可能不同
所以成员变量存储在不同的对象中

对类成员函数的解释:

但是每个对象调用的函数是相同的
为了节省空间,将成员函数从对象中剥离
到公共代码段,不管实例化多少个对象
只要调用成员函数就会去代码段找!


7. this指针

先看以下的日期类:

class Date
{ 
public:
	void Init(int year, int month, int day)
	{
 		_year = year;
	 	_month = month;
	    _day = day;
    }
private:
 	int _year;     // 年
	int _month;    // 月
	int _day;      // 日
};

int main()
{
	Date d1;
	d1.Init(2023,7,22);//初始化对象
	return 0;
}

看似Init只有三个参数
看似调用Init时只传了三个参数

但其实还有一个隐藏的指针this!

可以用下图理解this的位置:

【C++基础(五)】类和对象(上),C++初阶之路,c++,开发语言

并且在每一个成员变量之前
都有this指针解引用访问它:

【C++基础(五)】类和对象(上),C++初阶之路,c++,开发语言


7.1 this指针的特性

基本特性:

  1. this指针的类型:const 类类型 *
    即成员函数中,不能给this指针赋值

  2. 只能在“成员函数”的内部使用

  3. this指针不能我们显示去写
    也不能我们显示去传对象地址

  4. this指针存储在栈区,不存储在对象中

对特性的理解:

不能这样写代码:

class A
{ 
void Init(A* this,int a)
{
	_a=a;
}
 int _a;
};

int main()
{
	A a1;
	a1(&a,10);
}

假如这样写代码,那么函数参数就有三个
系统还是会自动传this指针,会报错


7.2 this指针的用处

假设我们实例化了两个对象
分别是d1和d2

class Date
{ 
public:
	void Init(int year, int month, int day)
	{
 		_year = year;
	 	_month = month;
	    _day = day;
    }
private:
 	int _year;     // 年
	int _month;    // 月
	int _day;      // 日
};

int main()
{
	Date d1;
	Date d2;
	d1.Init(2023,7,22);//初始化对象
	d2.Init(2023,7,23);
	return 0;
}

已知成员函数是放在公共代码段的
假如没有this指针存在
函数体又没有区别不同对象的手段

那么就会出现一个问题:
对象d1调用函数Init时,函数不知道是
哪一个对象调用了它,就无法区分对象

使用this指针将对象的地址传入函数中
函数体就可以区分不同对象了!


8. 总结以及拓展

本章是类和对象的入门篇
只介绍了类的解基本概念和特性
其中比较重要的是this指针
它还会陪伴我们很久!

基础不牢,地动山摇
类学不会,学C++就受罪

【C++基础(五)】类和对象(上),C++初阶之路,c++,开发语言

拓展: C++命名方式

C++又很多习惯的命名方式
这里介绍一个:驼峰法命名

  • 单词和单纯之间首字母大写
  • 函数名,类名首字母大写
  • 变量首字母小写,后面单词首字母大写
  • 成员变量的首字母前加下划线_

举例说明:

class Date
{ 
public:
  void InitDate(int year, int month, int day)//initialize date
  {                                          //初始化日期,简写后,I和D要大写
    _year = year;
    _month = month;
    _day = day;
  }
  void PrintInfo()//printf information,简写后P和I要大写
  {
    cout <<_year<< "-" <<_month << "-"<< _day <<endl;
  }
private:
  int _year; //成员变量前面加_
  int _month;
  int _day;     
};

🔎 下期预告:类和对象(中) 🔍

到了这里,关于【C++基础(五)】类和对象(上)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++初阶】类和对象(下)

      构造函数其实分为:     1.函数体赋值     2.初始化列表 之前所讲到的构造函数其实都是函数体赋值,那么本篇文章将会具体讲述初始化列表。 语法 以 一个冒号开始 ,接着是 一个以逗号分隔 的数据成员列表,每个\\\"成员变量\\\"后面跟 一个放在括号中的初始值或表达式。

    2024年02月05日
    浏览(40)
  • C++初阶(八)类和对象

    📘北尘_ :个人主页 🌎个人专栏 :《Linux操作系统》《经典算法试题 》《C++》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 声明为static的类成员称为类的 静态成员 ,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态

    2024年02月05日
    浏览(43)
  • C++初阶 类和对象(上)

    前言:C++初阶系列,每一期博主都会使用简单朴素的语言将对应的知识分享给大家,争取让所有人都可以听懂,C++初阶系列会持续更新,上学期间将不定时更新,但总会更的 目录 一、什么是面向对象编程 二、什么是类和如何定义类 1.类的概念 2.类的特点 3.访问限定符 4.如何

    2024年02月05日
    浏览(43)
  • C++初阶 - 3.类和对象(中)

    目录 1.类的6个默认成员函数 2.构造函数 2.2特性 3.析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 5.赋值运算符重载 5.1运算符重载  5.2 赋值运算符重载 5.3 前置++和后置++重载 6.日期类的实现 7.const成员 8.取地址及const取地址操作符重载 如果一个类中什么成员都有,

    2024年02月16日
    浏览(39)
  • 【C++进阶之路】类和对象(中)

    1.构造函数——完成对象成员变量的初始化 2.析构函数——完成空间(主要是堆)的释放 3.拷贝构造——用一个已初始化的对象初始另一个正在初始化的对象 4.赋值重载——用一个已初始化的对象赋值给另一个已经初始化的对象 5.取地址重载——对一个不加const的对象取地址 6.

    2024年02月03日
    浏览(45)
  • 【C++初阶】第三站:类和对象(中) -- 日期计算器

    目录 前言 日期类的声明.h 日期类的实现.cpp 获取某年某月的天数 全缺省的构造函数 拷贝构造函数 打印函数 日期 += 天数 日期 + 天数 日期 -= 天数 日期 - 天数 前置++ 后置 ++ 前置 -- 后置-- 日期类中比较运算符的重载 运算符重载 ==运算符重载 != 运算符重载 =运算符重载 运算符

    2024年02月19日
    浏览(42)
  • 【C++初阶】类和对象——构造函数&&析构函数&&拷贝构造函数

    ========================================================================= 个人主页点击直达: 小白不是程序媛 C++系列专栏: C++头疼记 ========================================================================= 目录 前言 类的6个默认成员函数 构造函数 概念 构造函数的特性 析构函数 概念 析构函数特性 拷贝构

    2024年02月06日
    浏览(56)
  • 【C++初阶】第三站:类和对象(中) -- 类的6个默认成员函数

    目录 前言 类的6个默认成员函数 构造函数 概念 特性 析构函数  概念 特性 拷贝构造函数 概念 特征 赋值运算符重载 运算符重载 赋值运算符重载 const成员 const修饰类成员函数 取地址及const取地址操作符重载 本章总结:         有时候我们写好了一个栈,头脑中第一件事

    2024年02月20日
    浏览(39)
  • 【C++打怪之路Lv3】-- 类和对象(上)

    🌈 个人主页:白子寰 🔥 分类专栏: C++打怪之路,python从入门到精通,数据结构,C语言,C语言题集 👈 希望得到您的订阅和支持~ 💡 坚持创作博文(平均质量分82+),分享更多关于深度学习、C/C++,python领域的优质内容!(希望得到您的关注~)    目录 面向对象和面向过程

    2024年04月27日
    浏览(46)
  • 【C++初阶】六、类和对象(初始化列表、static成员、友元、内部类)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【C++初阶】五、类和对象 (日期类的完善、流运算符重载函数、const成员、“”取地址运算符重

    2024年02月05日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包