栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

第10章、对象和类

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

第10章、对象和类

1、访问控制

公有成员函数是程序和对象的私有成员之间的桥梁,提供了对象和程序之间的接口。防止程序直接访问数据被称为数据隐藏。
类设计尽可能将公有接口与实现细节分开。将实现细节放在一起并将它们与抽象分开被称为封装。数据隐藏是一种封装,将实现的细节隐藏在私有部分中。封装的另一个例子是将类函数定义和类声明放在不同的文件中。

数据隐藏不仅可以防止直接访问数据,还让开发者无需了解数据是如何被表示的。

类和结构体

C++对结构体进行了扩展,使之具有与类相同的特征。唯一区别是,结构体的默认访问类型是public,而类为private。使用类实现类描述,结构体往往表示纯粹的数据对象。

类的内联方法

其定义位于类声明中的函数都将自动成为内联函数,类声明常将短小的成员函数作为内联函数,例如set_tot()函数。

class Stock{
	private:
	long share;
	double share_val;
	double total_val;
	void set_tot(){total_val=share*share_val;}
}

如果愿意,也可以在类声明之外定义成员函数,并使得其成为内联函数。为此,只需要在类实现部分中定义函数时使用inline限定符即可:,例子如下所示

class Stock{
	private:
	long share;
	double share_val;
	double total_val;
	void set_tot();
}

inline void Stock::set_tot(){total_val=share*share_val;}

内联函数的特殊规则要求在每个使用它们的文件中都对其进行定义。确保内联定义对多文件程序中的所有文件都可用:将内联定义放在定义类的头文件中。

创建的每个新对象都有自己的存储空间,用于存储其内部变量和类成员;但同一个类的所有对象共享同一组类方法,即每种方法只有一个副本。

小结

指定类设计的第一步是提供类声明。
第二步是实现类成员函数。

声明和定义构造函数

现在创建stack的构造函数。

stack(int co,long n);//构造函数声明
//构造函数定义
stack::stack(int co,long n){
...
}
使用构造函数

有两种使用构造函数来初始化对象的方式。

第一种是显式地调用构造函数

stack food=stack(3,1.3);

另一种是隐式地调用构造函数

stack food(3,1.3);

上面两种方式等价

还有一种是与New一起使用

stack *food=new  stack(3,1.3);
默认构造函数

默认构造函数是在未提供现式初始值时,用来创建对象的构造函数。

stack fool;//使用默认构造函数

上面这句话的前提是,如果没有提供任何构造函数,则C++将自动提供默认构造函数。它是默认构造函数的隐式版本,不做任何工作。

当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数。为类定义了构造函数后,程序员就必须为它提供默认构造函数。如果提供了非默认构造函数,但是没有提供默认构造函数,则下面的声明即将出错:

stack stk1;//不可能实现当前的构造

这样做的原因可能是想禁止创建未初始化的对象。
定义默认构造函数的方式有两种。一种是给已有构造函数的所有参数提供默认值:

stack(int co=0,long n=0);

另一种方式是通过函数重载来定义另一个构造函数——一个没有参数的构造函数:

stack();

只能有一个默认构造函数,因此不能同时采用这两种方式。

不要被非默认构造函数的隐式形式所误导:

stack stk(1,2);//调用非默认构造函数,
stack stk1();//stk1是一个返回stack对象的函数
stack stk2;//隐式调用默认构造函数。
C++11 列表初始化

C++11中,可以将列表初始化用于类,只要提供与某个构造函数的参数列表匹配的内容,并用大括号将它们括起:

Stock hot={"plus",100,&45.0};//
Stock jock{"age"};
Stock temp{};

//前面两个声明使用该构造函数来创建对象,第三个声明与默认构造函数匹配
Stock::Stock(const std::string &co,long n=0,double pr=0.0);

//
const 成员函数
const Stock hot=Stock{"plus",100,&45.0};//
hot.show();

由于hot是const类型对象,因此show函数要保证调用对象不被修改——调用对象和const一样,不应该被修改。
因此show应该被声明为const成员函数:

void show() const;//声明方法
void Stock::show() const//定义
{
...
}
作用域内枚举(C++11)

以下的枚举egg small和shirt small位于相同的作用域。它们将会发生冲突,编译器无法通过。

enum egg{small.large,jumbo};
enum shirt{small.large,Xlarge}

因此C++11提供一种新的枚举,其枚举量的作用域为类。实现方法如下,也可以用struct替代class。

enum class egg{small,large,jumbo};
enum class shirt{small,large,Xlarge};

使用方法

egg cho=egg::large;
shirt flo=shirt::large;

枚举量的作用域为类后。不同枚举定义中的枚举量就不会发生冲突了。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/990270.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号