我是靠谱客的博主 敏感鸡,最近开发中收集的这篇文章主要介绍C++类学习笔记(一),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

成员函数

class Sales_date
{
// 访问说明符
public:

	std::string isbn() const { return bookNo; } // 隐式的inline函数。
	Sales_date& combine(const Sales_date&);

// 访问说明符
private:
	double avg_price() const { return units_sold ? revenue / units_sold : 0; };
	std::string bookNo;
	unsigned units_sold = 0;
	double revenue = 0.0;
};

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

this 的引入

  • 成员函数通过一个名为this的额外的隐式参数来访问调用它的对象。(编译器会将调用对象的地址传递给隐式的this形参)
  • 因为this的目的总是指向“调用的对象”,所以this是一个常量指针,我们不允许改变this中保存的地址
  • 默认情况下this的类型是指向类类型非常量版本的常量指针(例: Sales_data *const this)
  • 对任何类成员的直接访问都被看作this的隐式引用。
std::string isbn() const { return bookNo; }

相当于

std::string isbn() const { return this->bookNo; }

常量成员函数

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

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

类作用域

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

  1. 首先编译成员声明
  2. 然后才轮到成员函数体(如果函数体存在)

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

在类外定义成员函数

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

非成员函数

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

构造函数

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

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

  • 和类的名字相同。
  • 没有返回类型
  • 构造函数不能被声明成const(当我们在创建类的一个const对象时,直到构造函数完成初始化过程,对象才能真正的取得其“常量“的属性)

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

默认构造函数

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

特殊性

  • 类没有显示的定义构造函数,那么编译器会为我们隐式的定义一个默认构造函数(又称为合成的默认构造函数)

合成的默认构造函数

  • 如果存在类内的初始值,用它来初始化成员
  • 否则默认初始化。

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

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

= 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的类能避免分配和释放内存带来的复杂性。

友元

类允许其他类或则函数访问它的非公有成员,令其他类或则函数成为它的友元

友元不是类的成员,也不受它所在的区域访问控制级别的约束
许多编译器并未强制限定友元函数必须在使用之前在类的外部声明

最后

以上就是敏感鸡为你收集整理的C++类学习笔记(一)的全部内容,希望文章能够帮你解决C++类学习笔记(一)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部