C++ 基础知识 类
类的基本概念
- 类定义:
最简单地说,类就是定义了一个新的类型和一个新作用域。
- 类成员:
每个类可以没有成员,也可以定义多个成员,成员可以是数据、函数或类型别名。
一个类可以包含若干公有的、私有的和受保护的部分。
所有成员必须在类的内部声明,一旦类定义完成后,就没有任何方式可以增加成员了。
- 构造函数:
创建一个类类型的对象时,编译器会自动使用一个构造函数来初始化该对象。构造函数是一个特殊的、与类同名的成员函数,用于给每个数据成员设置适当的初始值。
构造函数一般就使用一个构造函数初始化列表来初始化对象的数据成员:
// default constructor needed to initialize members of built-in type
Sales_item(): units_sold(0), revenue(0.0) { }
- 成员函数:
在类内部,声明成员函数是必需的,而定义成员函数则是可选的。在类内部定义的函数默认为 inline。
在类外部定义的成员函数必须指明它们是在类的作用域中。
- 数据的抽象和封装
数据抽象是一种依赖于接口和实现分离的编程(和设计)技术。类设计者必须关心类是如何实现的,但使用该类的程序员不必了解这些细节。
数据抽象和封装的好处:
- 避免类内部出现无意的、可能破坏对象状态的用户级错误。
- 随时间的推移可以根据需求改变或bug报告来完善类实现,而无需改变用户代码。
封装是一项低层次的元素组合起来的形成新的、高层次实体珠技术。函数是封装的一种形式:函数所执行的细节行为被封装在函数本身这个更大的实体中。同样地,类也是一个封装的实体:它代表若干成员的聚焦,大多数(良好设计的)类类型隐藏了实现该类型的成员。
- 为什么类的定义以;号结束?
因为在类定义之后可以接一个对象定义列表。定义必须以分号结束。
- 类对象
一旦定义了类,就 可以定义该类型的对象。定义对象时,将为其分配存储空间,但(一般而言)定义类型时不进行存储分配:
- 隐含的 this 指针
成员函数具有一个附加隐含的形参,即指向该类对象的一个指针。隐含形参名this ,与调用成员函数绑定在一起。
- 何时使用this指针
- 返回*this
- 从const成员函数返回*this
- 基于const的重载
- 可变数据成员
何时使用this指针?
当我们需要将一个对象作为整体引用而不是引用对象的一个成员时,使用this:该函数返回对调用该函数对象的引用。
返回*this
在单个表达式中调用move和set操作时,每个操作必须返回一个引用,该引用指向执行该操作的那个对象。
Screen& Screen::set(char c)
{
contents[cursor] = c;
return *this;
}
Screen& Screen::move(index r, index c)
{
index row = r * width; // row location
cursor = row + c;
return *this;
}注意:这些函数的返回类型是Screen,指明该成员函数返回对其自身类类型对象的引用。
Screen& Screen::set(char c)
{
contents[cursor] = c;
return *this;
}
Screen& Screen::move(index r, index c)
{
index row = r * width; // row location
cursor = row + c;
return *this;
}
从const成员函数返回*this
1.在普通的非const成员函数中,this类型是一个指向类类型的const指针,可以改变this所指向的值,但不能改变this所保存的地址。2.在const成员函数中。this类型是指向const类类型对象的const指针,所以既不能改变this指向的对象,又不能改变this保存的地址。
注意:const对象只能返回*this作为const引用
- 类的访问:
在类作用域之外,成员只能通过对象或指针分别使用成员访问操作符 . 或 -> 来访问。这些操作符左边的操作数分别是一个类对象或指向类对象的指针。跟在操作符后面的成员名字必须在相关联的类的作用域中声明:
另一些直接通过类使用作用域操作符(::)来访问。一般的数据或函数成员必须通过对象来访问。
-
友元
友元机制允许一个类将对其非公有成员的访问权授予指定的函数或类。友元的声明以关键字friend开始,它只能出现在类定义内部。
通常,将友元声明成组放在类定义的开始或结尾是个好主意。
-
static 类成员
正如类可以定义共享的 static 数据成员一样,类也可以定义 static 成员函数。static 成员函数没有形参,他可以直接访问所属类的static成员,但不能直接使用非static成员。
使用static成员而不是全局对象有3个优点:
1.static成员的名字是在类作用域中,因此可以避免与其他类成员或全局对象的名字冲突。
2.可以实施封装,static成员可以是私有的,而全局对象不可以。
3.可以清晰程序员意图。