C++类学习笔记(一)

C++类学习笔记(一),第1张

C++类学习笔记(一)

定义在类内部的函数时隐式的inline函数。

this
  • 成员函数通过一个名为this的额外的隐式参数来访问调用它的对象。(编译器会将调用对象的地址传递给隐式的this形参)
  • 默认情况下this的类型是指向类类型非常量版本的常量指针(例: Sales_data *const this)
常量成员函数

this是隐式的并不会出现在参数列表中,所以在哪儿将this声明成指向常量的指针就成为我们必须面对的问题。C++语言的做法允许把const关键字放在成员函数的参数列表之后,此时,紧跟在参数列表后面的const表示this是一个指向常量的指针。像这样使用const的成员被称为常量成员函数。

常量对象,以及常量对象的引用或指针只能调用常量成员函数

类作用域

编译器分两个步骤处理类:

  • 首先编译成员声明
  • 然后才轮到成员函数体

所以成员函数体可以随便使用类中的其他成员而无需在意这些成员出现的顺序。、

在类外定义成员函数
  • 成员的名字必须包含所属类名(说明该函数被声明在类的作用域内).
  • 成员函数的定义必须与它的声明匹配。
  • 和定义在类内部一样也可以使用类的成员变量。
非常成员函数

如果含糊是在概念上属于类但是不定义在类中,它一般应与类声明在同一文件当中。

构造函数

每个类都分别定义了它的对象被初始化方式,类通过一个或几个特俗的成员函数来控制其对象的初始化过程,这些函数叫构造函数。

构造函数的任务是初始化类对象的数据成员,无论何时只要类对象被创建,就会执行构造函数。
特点:

  • 和类的名字相同。
  • 没有返回类型
  • 构造函数不能被声明成const

当我们创建类的一个const对象时,知道构造函数完成初始化过程,对象才能真正取得其“常量属性”,因此构造函数在const对象构造过程可以向其写值。

默认构造函数

类通过一个特殊的构造函数来控制默认初始化过程。
特殊性

  • 类没有显示的定义构造函数,那么编译器会为我们隐式的定义一个默认构造函数(又称为合成的默认构造函数)
合成的默认构造函数
  • 如果存在类内的初始值,用它来初始化成员
  • 否则默认初始化。

某些类不能依赖于合成的默认构造函数

  • 编译器只有在发现类不包含任何构造函数的情况下才会替我们生成一个构造函数,如果定义了其他的构造函数必须在定义一个默认构造函数,不然类就没有默认构造函数了。
  • 对于某些类来说,合成默认构造函数可能执行错误的 *** 作。例如如果类中包含内置类型或则复合类型的成员,则只有当这些成员全都被赋予了类内的初始值时,这个类才使用使用与使用合成默认的构造函数。(如果没有类内初始值,可能会得到未定义的值)
  • 编译器有时候不能为某些类合成默认的构造函数。例如如果类中包含一个其他类类型的成员且这个成员的类型没有默认构造函数。那么编译器将无法初始化该成员。

= defaule
在C++11中通过在参数列表后面写上 = default 来要求编译器生成构造函数。其中 = default 既可以和声明一起出现在类内部,也可以作为定义出现在类外部,如果出现在类内部,则默认构造函数时内联的;如果定义在类外部,则该成员默认情况下不是内联的。
如果编译器不支持类内初始化值,那么默认的构造函数应该使用构造函数初始化列表,来初始化类的每个成员

构造函数初始化列表

Sales_data(const int &s):bookNo(s){} 加粗部分就是构造函数初始化列表。
Sales_data(const int &s):bookNo{s}{} 加粗部分就是构造函数初始化列表。
可以是括号也可以是花括号。

  • 当某个数据成员被构造函数初始化列表忽略时,它将以合成默认构造函数相同的方式隐式初始化。
  • 构造函数不应该轻易覆盖掉类内初始值,除非新赋的值与原值不同。如果你能使用类内初始值。则所有构造函数都应该显式地初始化每个内置类型的成员。
在函数体外定义构造函数

Sale_data::Sales_data(std:: istream &is)
{
//
}
没有返回类型,但是需要指明作用域。

类的拷贝,赋值和析构

拷贝: 初始化变量以及值的方式传递或返回一个对象
赋值: 使用了赋值运算符
析构: 当对象不在存在时,执行销毁 *** 作,比如局部对象会在创建它的块结束时销毁,当vector对象被销毁时存储在其中的对象也被销毁。

如果我们不主动定义这些 *** 作,则编译器将替我们合成他们,一般将对对象的每个成员执行拷贝、赋值和销毁 *** 作。

某些类不能依赖与合成的版本

  • 当类需要分配类对象之外的资源时,合成的版本常常会失效。

很多需要动态分配内存的类能使用vector对象或则string对象管理必要的存储空间。使用vector或则string的类能避免分配和释放内存带来的复杂性。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5099882.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-16
下一篇 2022-11-16

发表评论

登录后才能评论

评论列表(0条)

保存