C++关于类和对象的基础语法

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

C++关于类和对象的基础语法,#C++的学习与总结,c++,开发语言

前言:

介绍c++中类和对象的基础语法和注意事项,这里是c++入门的第一道坎,细节很多,在后面的更深的学习中还会反复提到。

目录

前言:

1.OO语言

2.类的定义

3.类的访问限定符与封装的引入

4.类的实例化

5.关键字this指针(很重要)

6.this空指针问题

总结:

类的访问限定符与this指针很重要,在后面会一直用,下一章将会介绍六大默认成员函数。


1.OO语言

谈到类,就离不开对象,而像我们的c++,Java也就是面对对象(Object Oriented)的语言,什么是面对对象呢?

简单来说,就是让一件事分为不同的对象,靠对象间的交互完成,但我们c++并不是完全的面对对象,因为是兼容c语言的,而c语言就是经典的面向过程的语言。

2.类的定义

c++中把结构体升级成了类(其实结构体也是类的一种),类里面可以定义函数。

	 class className
	{
	//类体,由成员函数和成员变量组成
	};                        //结尾带分号
  • class为定义类的关键字,className为类的名字,类中的变量称为类的属性或是成员变量

  •  函数称为类的方法或是成员函数,以类定义的变量可以叫做对象

注意

  1. 成员变量和函数定义的位置不会影响,类会在调用的时候在类体里面整体搜索。  
  2. 如果是用struct定义一个类(class有些不同,下面再提),成员函数可以直接定义在类里面,也可成员函数声明和定义分离,也就是如果定义在另一个文件里面,定义时就要标明函数的来源,例如类名:函数名,声明放在头文件中时,注意缺省参数要在声明里缺省。

3.类的访问限定符与封装的引入

C++关于类和对象的基础语法,#C++的学习与总结,c++,开发语言

  • public修饰的成员在类外是可以直接被访问的
  • protected和private修饰的成员在类外不能直接访问
  • 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现为止
  • 如果没有访问限定符,作用域就到类的结束
  • class的默认访问权限为private,struct为public(主要因为struct要兼容c)

注意

  1. 不建议使用默认的访问权限,大部分情况下成员变量不希望被改变,要用private或者protected定义(目前二者没有区别,在继承的部分会介绍区别),所以一般建议成员函数被共用就用public定义,不是就用private。
  2. c++中struct还可以继续当做结构体使用,class也可以但是不会使用class当做结构体。
  3. 成员变量定义时最好前面加上_,可以在前面或者在后面,防止成员变量与成员函数形参名相同导致出错。
  4. 类定义了一个新的作用域,再类体外定义成员时,需要用::作用域操作符指明成员属于哪个类域、

封装:了解了基本的类的语法,我们再来简单的谈封装,封装就是通过类将数据及操作数据的方法进行有机结合,通过访问权限来隐藏对象内部的实现细节,控制某些方法可以在类外部直接被使用。

4.类的实例化

与结构体一样。类在创建的时候没有开空间,而创建类 类型的变量的时候(也就是对象)时开了空间,此时就能通过对象去访问类里面的成员了,这就叫做类对象的实例化,所以创建的类的成员的成员变量只是声明,并没有开辟空间。

然后,我们需要知道一个重要的点,假设我们现在定义一个这样的类:

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._year++;
    d2._year++;
  
    //一个类创建出了两个对象,分别调用的成员函数是同一个,存放在代码段
	d1.Init(2023, 3, 22);
	d2.Init(2024, 3, 22);


	return 0;
}

d1和d2分别访问的成员变量是同一个吗?d1和d2分别访问的成员函数是同一个吗?

我们需要知道,成员变量在对象中,成员函数不在对象中,怎么理解呢?

因为每一个对象都有独立的空间,每个对象的成员变量都是独立存储的,所以两个对象访问一样的成员变量但其实不是同一个;而类里的函数是公有的,成员函数直接放到对象里面就浪费空间了,所以大小也不计算在类里,而是放到一个公共的区域(代码段),所以调用类里面的函数就去代码段里去找(汇编中call这个函数的地址,call这条指令就存放在代码段里面)

注意:没有成员变量的类的大小是多少?大小是1byte,这1byte不存储有效的数据,用来占位,标识对象被实例化定义出来了,仅仅是标记对象存在过。

5.关键字this指针(很重要)

	d1.Init(2023, 3, 22);
	d2.Init(2024, 3, 22);

还是上面的代码,虽然d1,d2都是调用的同一个函数,但编译器是怎么确定函数中的_year是谁的呢?这就引入了this指针:

C++关于类和对象的基础语法,#C++的学习与总结,c++,开发语言

 实际传参时编译器自动传的还有调用对象的地址,然后函数中使用一个this指针接收,类型就是这个类,d1调用,this中就是d1的地址,d2调用,this中就是d2的地址。

注意

  1. 函数里面可以出现this,但是形参与实参不能自己加,一般里面也不加。
  2. this指针是存放在栈上的(因为它是隐形的形参,vs下是通过ecx寄存器存储),不要跟代码段混淆了,this指针是形参是数据,传参需要压栈;call函数的地址是指令,指令放在代码段。

6.this空指针问题

class Date
{
public:
	void Init(int year, int month, int day)
	{
		/*_year = year;
		_month = month;
		_day = day;*/

		cout << this << endl;
		this->_year = year;
		this->_month = month;
		this->_day = day;
	}

	void func()
	{
		cout << this << endl;
		cout << "func()" << endl;
	}
private:
	int _year=0;
	int _month=0;
	int _day=0;
};



int main()
{
	Date* ptr = nullptr;
	ptr->func();//正常运行
	ptr->Init(2024, 3, 22);//运行崩溃
    (*ptr).func();//正常运行
    return 0;
}

 现在想调用func(),直接使用->去调用会出问题吗?

分析一下,func是成员函数,但并不在对象里面,所以调用这个函数就要去call它的地址,而这句指令存放在代码段中,这里的箭头就是去Date这个类域中找func,没有解引用的意思,而传过去的ptr的地址虽然是空(this地址也是空),由于func中没有对*this解引用,所以没问题。另外,如果我们去掉ptr->就访问不到这个成员函数了,其一是因为不用对象调用函数就去全局里找么人func又只是在类这个域中,肯定找不到,其二是因为去掉就没法出传递this指针(Date::func()没有传递给this指针的内容)

那第二个为什么会崩溃呢?

因为传过去的ptr的地址为空,所以this也是空,函数里面又有解引用所以运行就崩溃了。

那第三个又是为什么正常运行呢?

这还是编译器的处理,编译器很聪明,调用类的成员函数会优先传this指针去看类里面有没有这个函数,而不是先解引用。

所以我们可以理解为在调用类的成员函数的时候使用->或者.,会优先去传this指针去类里面找(编译器的处理),而不是理解为c语言中的解引用,但如果传的是个空指针,而且这个成员函数内还对this指针解引用了,这时就会报错了。文章来源地址https://www.toymoban.com/news/detail-842716.html

总结:

类的访问限定符与this指针很重要,在后面会一直用,下一章将会介绍六大默认成员函数。

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

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

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

相关文章

  • C++类和对象基础知识详解

    1.一切皆是对象。如下图: ·女人是一个对象 ·鞋子是一个对象 ·包包是一个对象 ·衣服是一个对象 ·裤子是一个对象 ·手链是一个对象 … 这里人这个对象,由鞋子、包包、衣服、 裤子、手链等对象组成。 3.每个对象都有: a)数据(描述对象的属性) b)函数(行为操作代码

    2023年04月12日
    浏览(43)
  • c++学习——类和对象

    类是自定义数据类型,是C语言的结构体进化而成的 对象是类实例化出的,用数据类型定义一个变量 C和C++中struct区别: C语言struct只有变量 C++语言struct既有变量,也有函数 1、为什么要有封装? 封装是把属性(变量)和方法(函数)封装到类内,然后给这些数据赋予权限,防

    2024年02月07日
    浏览(36)
  • C++类和对象-多态->多态的基本语法、多态的原理剖析、纯虚函数和抽象类、虚析构和纯虚析构

    #includeiostream using namespace std; //多态 //动物类 class Animal { public:     //Speak函数就是虚函数     //函数前面加上virtual,变成虚函数,那么编译器在编译的时候就不能确定函数调用了。     virtual void speak()     {         cout \\\"动物在说话\\\" endl;     } }; //猫类 class Cat

    2024年02月20日
    浏览(37)
  • 【C++学习】类和对象(上)

    前言: 由于之前电脑“嗝屁”了,导致这之前一直没有更新博客,今天才拿到电脑,在这里说声抱歉。接下来就进入今天的学习,在之前我们已经对【C++】进行了初步的认识,有了之前的知识铺垫,今天我们将来带领大家学习我们【C++】中的一个重要知识,即“ 类和对象 ”

    2023年04月10日
    浏览(31)
  • C++学习:类和对象(上)

    这是C++这样的面向对象的语言具有的特性,相较于C语言来说,更加方便的去编写代码,调用代码。 当需要大量重复的调用同一个函数的时候,我们每创建一个函数,就会建立一个栈帧,这样对于空间来讲不友好,C语言中有宏函数这样的函数,来解决这一问题,下面是宏函数

    2023年04月23日
    浏览(34)
  • 【C++基础(六)】类和对象(下)--初始化列表,友元,匿名对象

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C++初阶之路⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C++   🔝🔝 关于类和对象的大致内容已经结束 本篇文章主要是介绍一些冗杂的细节 虽然本节的内容属于对类和对象锦上添花 但在很多特定的场所下,还是

    2024年02月14日
    浏览(61)
  • C++学习之路(C++初阶)——类和对象(上)

    ✨✨欢迎来到T_X_Parallel的博客!!       🛰️博客主页:T_X_Parallel       🛰️专栏 : C++初阶       🛰️欢迎关注:👍点赞🙌收藏✍️留言       🛰️友友们的支持是本博主更新的动力   本博客主要为学习C++类和对象内容做准备,开头补充

    2024年02月07日
    浏览(47)
  • 【C++学习】类和对象--多态【待补充】

    多态是C++面向对象三大特性之一 静态多态:         函数重载和运算符重载属于静态多态,复用函数名(函数地址早绑定,编译阶段确定函数地址) 动态多态:         派生类和虚函数实现运行时多态(函数地址晚绑定,运行阶段确定函数地址)  案例: 输出:  但

    2024年02月02日
    浏览(35)
  • 【C++基础(六)】类和对象(中) --拷贝构造,运算符重载

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C++初阶之路⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C++   🔝🔝 本章重点: 本篇文章将详细讲解拷贝构造函数 和运算符重载,并介绍const成员的概念 拷贝构造函数和运算符重载 是类和对象中六大默认成员函数

    2024年02月14日
    浏览(39)
  • 【C++深入浅出】类和对象上篇(类的基础、类的模型以及this指针)

    目录 一. 前言  二. 面向对象与面向过程         2.1 面向过程         2.2 面向对象 三. 类的基础知识 3.1 类的引入 3.2 类的定义 3.3 成员变量的命名规则 3.4 封装 3.5 类的访问限定符 3.6 类的作用域 3.7 类的实例化 四. 类的对象模型 4.1 类对象的大小 4.2 类对象的存储方式 4.3 空

    2024年02月10日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包