iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++全面精通类与对象
  • 305
分享到

C++全面精通类与对象

2024-04-02 19:04:59 305人浏览 薄情痞子
摘要

目录运算符重载运算符复用前置后置运算符constc++ 的io流初始化列表explicit 关键字运算符重载 C++语法设计很巧妙,比如运算符重载一个 > bool opera

运算符重载

C++语法设计很巧妙,比如运算符重载一个 >

bool operator>(const Date& d)
{
     return !(*this <= d);
}

这里可以结合前面的内联函数来进一步提高代码的效率,而内联函数不支持 .h 和 .cpp 分开写,所以成员函数要成为内联函数最好的办法就是把定义放在类里面,类里面定义的会被默认为是 inline 内联函数。

我们计算日期类的加法时:

	Date Date::operator+(int d)
	{
		Date ret(*this);
		ret.day += d;
		while (ret.day > Getmonth(ret.year, ret.month))
		{
			ret.day -= Getmonth(ret.year,ret.month);
			ret.month++;
			if (ret.month == 13)
			{
				ret.year += 1;
				ret.month = 1;
			}
		}
		return ret;
	}

运算符复用

我们可能会有这样的问题,这里面 += 和 + 两个运算符其实是一样的,实现原理上没什么差别,那你可能会封装个函数来解决他们的关系,但是其实直接让他俩互相附庸,分为了 += 复用+ 和 + 复用 += 两种办法:

1.+= 复用 +:

2.+ 复用 +=(更优):

两种乍一看其实没什么区别,但是其实有优越和劣势可以分的,很 += 是不需要构造的,因为它是传引用调用(返回值为域外的 this 指针的内容,必须要传引用),但是 + 是必须要构造的,拷贝局部对象的 ret 和 最后的 return , 一共需要构造两次。

让 += 复用 +,+在先就会让整个过程构造 4 次,而让 + 来复用 += 的话,+ 还是构造 2 次没得说,但是 += 就不需要拷贝构造了,整个过程就只需要构造 2 次,消耗就会小很多。咱就应该多抠抠细节,写出正确的代码固然重要,但是追求更优秀更高效的代码是每一个程序员的基本素养。

前置后置运算符

既然 +,- 能造,那 ++ 和 – 自然也不在话下,但是这就不好玩了啊, num++ 和 ++num 功能上都是 +1,写成运算符重载格式都是

Date Date::operator++();

我们该怎么区分呢?要知道函数名相同而参数不同就应该敏感使用函数重载,C++这个大聪明是不会考虑不到这些的,因此就有了对应的语法:前置不带参数而后置带参数

Date operator++();//前置++

Date operator++(int d);//后置++

Date& operator++()//前置
{
   *this += 1;
   return *this;
}
Date operator++(int)//后置
{
    Date tmp(*this);
    *this += 1;
    return tem;
}

其实括号里面这个参数并没有任何意义,单纯只是用来区分前置与后置的写法,所以这里不写形参也是可以的,我这里就只给了一个类型。还有这里千万不要想着去加一个缺省值,显式传参还好,要是不传参编译器就没办法区分开来,属于是没事找事了。

const

给一个场景:

void Func(const Date& d)

{

d1.Print();

}

void test()

{

Date d1(2022,5,19);

d1.Print();

Func(d1);

}

这个场景下就会报错:

说实在的,这个报错我自己也看的云里雾里,为什么 Print 那里不报错到了 Func 里面 Print 就要报错?Print 传的过去 Func 就传不过去了?究其为什么会报错,其实涉及到一个权限问题。

void Print(Date* const this)
{
     cout<<year<<"-"<<month<<"-"<<day<<endl;
}

我们知道 Print() 的参数其实是 Date& const this ,在上面场景中去调用 Print 时其实参数是 &d1,传对象的地址。在 Print 定义时 const 修饰的是 this 指针,const 修饰的变量可以初始化,此时指针不能被改变但是他指向的内容可以被初始化和修改;而 Func 的 const 修饰 Date*,他指向的内容不能被修改,所以这是一个经典的权限放大问题。

const Date* 要传给 Date* ,所以我们需要一个 const 进行修饰保护,但是 this 本质是一个隐含形参,我们没办法显式调用,也就是说 const 没办法进行修饰。那么C++也提供了一种修饰方法打破这个僵局,就是在函数尾巴加上 const。

void Print() const
{}

尾巴上的 const 编译器就会默认你是加在了函数原本定义的前面,这样就完美了。

C++ 的IO流

我们在代码中使用的 << , >> 为流输入和流提取操作符,只要涉及输入或者输出数据,我们立马想到的就是 cin 和 cout,这俩货其实是全局的对象, cin 对应 istream 类,cout 对应 ostream 类,它们都声明在 头文件中,这也解释了“为什么在 C++ 程序中引入 就可以使用 cin 和 cout”。

我们之所以可以在 <<, >> 之后接上任何类型,是因为强大的语法对每种类型进行了重载,能自动识别类型的本质就是函数重载,所以如果一个 int 类型的流插入 cin<<1 其实是 cin . operator <<(1)。

初始化列表

与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段,初始化列表可以看成是对象的成员变量定义的地方:

class Func
{
public:
    Func(int a):
    _a(a){} // 初始化列表
private:
    int _a;
};

注意:每个成员变量在初始化列表中只能出现一次因为初始化只能初始化一次,还要明确哪些成员必须放在初始化列表进行初始化:

  1. 引用成员变量
  2. const 成员变量
  3. 自义定类型成员(该类没有默认构造函数)

其他变量即可以在初始化列表初始化也可以在函数体内初始化,内置类型成员不处理时,会调用默认构造函数即随机值,如果我给出缺省值,那么之这个值就是给初始化列表用的,如果在初始化列表也同时给出这个内置类型的初始化值,就会采用初始化列表的值。我们应该尽量在初始化列表就初始化完,这样能尽可能的减少很多毛病效率也高。

再来看看这个题目:

这个程序的结果是啥?

答案是 1 和随机值,因为成员变量在类中的声明次序就是他在初始化列表中的初始化顺序,与他在初始化列表中的先后次序无关。_a2 先声明 _a2 = _a1,此时 _a1 为随机值,所以 _a2 为随机值,_a1 为 1。

explicit 关键字

构造函数不仅可以构造和初始化对象,对于单个参数的构造函数,还具有类型转换的作用。在C语言里面我们就知道有隐式类型转换,其实在 C++ 里面也是一样的,比如针对我定义的一个 Date(int year):

Date d1(2022);
Date d2 = 2022;

显然, 这里 d2 需要的是 Date 类型的参数, 而我们传入的是一个int, 这个程序却能成功运行, 就是因为这隐式调用,另外说一句, 在对象刚刚定义时, 即使使用的是赋值操作符 = , 也是会调用构造函数, 而不是重载的 operator= 运算符。这两个语句对应前者是构造,而后者是构造+拷贝构造,相当于发生了隐式类型转换, 如果我们写成:

explicit Date(int year)

这个关键字会阻止这种转换的发生。

到此这篇关于C++全面精通类与对象的文章就介绍到这了,更多相关C++类与对象内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++全面精通类与对象

本文链接: https://www.lsjlt.com/news/149960.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++全面精通类与对象
    目录运算符重载运算符复用前置后置运算符constC++ 的IO流初始化列表explicit 关键字运算符重载 C++语法设计很巧妙,比如运算符重载一个 > bool opera...
    99+
    2024-04-02
  • Python面试:如何精通对象?
    Python面试:如何精通对象? 在Python编程中,对象是一种非常重要的概念。在面试中,很多公司都会对面试者的对象理解能力进行考察。那么,如何精通对象呢?本文将为大家介绍Python中对象的概念、创建对象的方法、对象的属性和方法、以及如...
    99+
    2023-09-24
    面试 对象 教程
  • Java全面细致讲解类与对象
    目录类和对象的关系类和对象的实例化static关键字private实现的封装构造方法this关键字代码块匿名对象小结类和对象的关系 类就是一类对象的统称。对象就是这一类具体化的一个...
    99+
    2024-04-02
  • Node.js 全局对象:从入门到精通
    属性 process: 提供有关当前 Node.js 进程的信息,例如其 PID、命令行参数和环境变量。 console: 用于在终端输出消息,提供 log(), error(), warn(), info() 和 dir() 等方法。...
    99+
    2024-04-02
  • C++深入讲解类与对象之OOP面向对象编程与封装
    目录1.面向对象编程2.面向过程性编程和面向对象编程3.类的引入4.类的定义4.1类的两种定义方式4.1.1声明和定义全部放在类体中4.2.2.声明和定义不放在类体中5.类的访问限定...
    99+
    2024-04-02
  • 课时37:类与对象:面向对象编程
    目录:   一、self是什么   二、Python的魔法方法   三、公有和私有   四、课时37课后习题及答案   ***************** 一、self是什么 ***************** 对象的方法都有一个self...
    99+
    2023-01-30
    课时 面向对象 对象
  • python中面向对象_类_对象的概念与
    1. 面向对象的概念,面向对象是一种编程思想。 是对现实世界中一类事物的抽象,在编程中可以理解为是一种建立现实世界事物的模型     2.  面向对象和面向过程的区别: 面向过程关注的是完成工作的步骤。 面向对象关注的是谁能完成工作。 面...
    99+
    2023-01-30
    面向对象 对象 概念
  • 深入 ASP 类:掌握面向对象的精髓
    类和对象 类是对象的蓝图,定义了对象的属性(数据)和方法(行为)。对象是类的实例,它具有特定的属性值并可以执行其定义的方法。在 ASP.NET 中,类通常由其名称和派生的 namespace 指定。 属性 属性表示对象的特性,可以获取或设...
    99+
    2024-04-02
  • 透视 Java 里的类与对象:对象导向编程的精髓
    类的概念 类是 OOP 中的模板或蓝图,定义了对象的属性(数据字段)和行为(方法)。它封装了数据和操作数据的方法,形成一个独立的、可重用的实体。 对象的创建 对象是类的实例化,它包含类中定义的数据和行为。通过使用 new 关键字可以创建...
    99+
    2024-03-09
    Java、类、对象、封装、继承、多态
  • python 面向对象、类、对象
    class 类 object 对象 object-oriented programming 面向对象,简称OOP attribute 属性 method 方法 inheritance 继承 python中通过类和对象来实现 ...
    99+
    2023-01-31
    面向对象 对象 python
  • C++类与对象实例分析
    这篇“C++类与对象实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++类与对象实例分析”文章吧。运算符重载C++语...
    99+
    2023-06-30
  • 类与对象
    目录 类与对象 现实世界中定义类和对象 定义对象 定义对象 程序中定义类和对象 ...
    99+
    2023-01-31
    对象
  • 揭秘Python封装与抽象类的奥秘,掌握面向对象编程精髓
    一、Python封装的奥秘 封装是面向对象编程的基本思想之一。它通过将数据的表示和实现细节隐藏在抽象接口之后,对外提供统一的访问方式,从而实现信息的保密性和安全性。 在Python中,封装可以通过使用类和对象来实现。类定义了数据的属性和...
    99+
    2024-02-11
    Python 面向对象 封装 抽象类 继承 多态
  • C++类与对象之日期类的实现
    目录1. 实现前的铺垫2. 日期类的实现2.1 日期+=天数2.2 日期-=天数2.3 日期-天数2.4 日期+天数2.5 前置++2.6 后置++2.7 前置–2.8 后置–2.9...
    99+
    2024-04-02
  • C++浅析类与对象基础点
    目录认识类和对象访问限定符this指针认识类和对象 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C++是基于面向对象的,关注的是对象,将一件事...
    99+
    2024-04-02
  • C++类与对象的示例分析
    这篇文章主要介绍了C++类与对象的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。类的引入在引入类之前,先来回忆一下C语言中的结构体。结构体是一种自定义类型,可以在其中...
    99+
    2023-06-29
  • 掌握 Java 类与对象:面向对象设计的秘诀
    前言 面向对象编程 (OOP) 是一种强大的编程范例,它通过将程序组织为对象来解决复杂问题。在 Java 中,类和对象是 OOP 的核心概念。类充当蓝图,用于创建特定类型的数据和行为的对象。 Java 类 Java 类是一组相关数据的集合...
    99+
    2024-03-09
    Java 类、Java 对象、面向对象编程、OOP 设计
  • C++进一步认识类与对象
    目录赋值操作符重载函数1.运算符重载2.赋值运算符重载3.默认的赋值操作符重载函数4.赋值重载函数与拷贝构造函数的对比日期类的实现const成员1.const修饰类的成员函数2.小结...
    99+
    2024-04-02
  • C++类与对象的详细说明
    目录类的引入类的定义1、声明和定义全部放在类体中2、声明放在头文件,定义放在源文件中类的访问限定符号及封装访问限定符封装类的实例化类对象模型this指针this指针的特性总结类的引入...
    99+
    2024-04-02
  • C++编程面向对象入门全面详解
    目录类1. struct和class的区别2. explicit构造3. const和mutable4. 自引用5. static复数的实现6.成员函数重载7.运算符重载8.new9...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作