细嚼慢咽C++primer(4)——类(1):构造函数,类型别名
1 最简单地说,类即使定义了一个新的类型和一个新的作用域。
2 基础
1 构造函数
构造函数一般应使用一个构造函数初始化列表,来初始化对象的数据成员。
Sales_item(): units_sold(0), revenue(0.0) {};
2 成员函数
在类内部定义的函数默认为inline.
将关键字const加在形参表之后,就可以将成员函数声明为常量:
double avg_price() const;
const成员不能改变其所操作的对象的数据成员。const必须同时出现在声明和定义中,若只出现在其中一处,就会出现一个编译时错误。
习题12.1:
using namespace std;
class Person {
private:
string name;
string address;
}
习题12.2:
using namespace std;
class Person {
Persion(string &name, string &addr)
{
}
private:
string name;
string address;
};
习题12.3:
using namespace std;
class Person {
Persion(string &name, string &addr)
{
}
private:
string name;
string address;
public:
string getName() const
{
return self.name;
}
string getAddr() const
{
return self.address;
}
};
返回名字和地址的操作不应该修改成员变量的值,所以应该指定成员函数为const。
习题12.4:
name和address为private实现数据隐藏, 函数getName() 和getAddr()为public提供接口,构造函数通常也为public.
3 数据抽象和封装
在C++中,使用访问标号(public, private, protected)来定义类的抽象接口和实施封装。
两个优点:
- 避免类内部出现无意的,可能破坏对象状态的用户级错误;
- 随时间推移可以根据需求改变或缺陷报告来完善类实现,而无需改变用户级代码。
习题12.5:
C++支持三种访问标号,public private protected
习题12.6:
class关键字定义的类,默认的访问权限为private,struct关键字定义的类,默认的访问权限是public。
习题12.7:
封装是一种将低层次的元素组合起来形成新的,高层次实体的技术。
封装隐藏了内部元素的实现细节。
4 使用类型别名来简化类
类可以定义自己的局部类型的名字。
class Screen {
public:
// interface member functions
typedef std::string::size_type index;
private:
std::string contents;
index cursor;
index height, width;
};
可以在类定义体内指定一个成员为inline,作为其声明的一部分,或者,也可以在类定义体外部的函数定义上指定inline。在声明和定义处指定inline都是合法的。
注意:inline成员函数的定义必须在调用该函数的每个源文件中是可见的,不在类体内定义的inline成员函数,其定义通常应放在有类定义的同一头文件中。
12.8:
class Sales_item {
public:
double avg_price() const;
bool same_isbn(const Sales_item &rhs) const
{
return isbn == rhs.isbn;
}
private:
std:string isbn;
unsigned units_sold;
double revenue;
};
inline double Sales_item :: avg_price() const
{
if (units_sold)
return revenue/units_sold;
else
return 0;
}
其他的两种写法:
- 将成员函数的定义写在类内部;
- 在类内部进行成员函数的声明时,指定inline关键字。
习题12.9:
class Screen {
public:
// interface member functions
typedef std::string::size_type index;
Screen(index ht, index wt, const std::string &cntnts)
{
height = ht;
width = wt;
contents = cntnts;
}
private:
std::string contents;
index cursor;
index height, width;
};
细嚼慢咽C++primer(4)——类(1):构造函数,类型别名的更多相关文章
- 浩哥解析MyBatis源码(八)——Type类型模块之TypeAliasRegistry(类型别名注册器)
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6705769.html 1.回顾 前面几篇讲了数据源模块,这和之前的事务模块都是enviro ...
- MyBatis源码解析(八)——Type类型模块之TypeAliasRegistry(类型别名注册器)
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6705769.html 1.回顾 前面几篇讲了数据源模块,这和之前的事务模块都是enviro ...
- 【C++ Primer 第15章】定义派生类拷贝构造函数、赋值运算符
学习资料 • 派生类的赋值运算符/赋值构造函数也必须处理它的基类成员的赋值 • C++ 基类构造函数带参数的继承方式及派生类的初始化 定义拷贝构造函数 [注意]对派生类进行拷贝构造时,如果想让基类的成 ...
- C++中 类的构造函数理解(一)
C++中 类的构造函数理解(一) 写在前面 这段时间完成三个方面的事情: 1.继续巩固基础知识(主要是C++ 方面的知识) 2.尝试实现一个iOS的app,通过完成app,学习iOS开发中要用到的知识 ...
- C++ Primer 与“类”有关的注意事项总结
C++ 与"类"有关的注意事项总结(一) 1. 除了静态 static 数据成员外,数据成员不能在类体中被显式地初始化. 例如 : class First { int memi = ...
- scala中的面向对象定义类,构造函数,继承
我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面 ...
- 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)
[源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...
- scala入门教程:scala中的面向对象定义类,构造函数,继承
我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面 ...
- [转]c++类的构造函数详解
c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初 ...
随机推荐
- javac的访问者模式2
(5)Printer /** * A combined type/symbol visitor for generating non-trivial(有意义的) localized string * ...
- https证书pfx 生成 pem,crt,key
(1)将.pfx格式的证书转换为.pem文件格式: openssl pkcs12 -in xxx.pfx -nodes -out server.pem (2)从.pem文件中导出私钥server ...
- GANS--理解
GAN所建立的一个学习框架,实际上就是生成模型和判别模型之间的一个模仿游戏.生成模型的目的,就是要尽量去模仿.建模和学习真实数据的分布规律:而判别模型则是要判别自己所得到的一个输入数据,究竟是来自于真 ...
- WPF自定义Button样式(按钮长度随Content长度自适应)
代码如下: <Style x:Key="ButtonStyle" TargetType="Button"> <Setter Property= ...
- minStack实现
设计包含 min 函数的栈(栈)定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素.要求函数 min.push 以及 pop 的时间复杂度都是 O(1). #include <a ...
- Windows下安装PHP开发环境
一.Apache 因为Apache官网只提供源代码,如果要使用必须得自己编译,这里我选择第三方安装包Apache Lounge. 进入Apachelounge官方下载地址:http://www.apa ...
- 推荐网站 explainshell.com
ls 显示指定目录下的文件和目录,默认为当前目录. -a 显示所有文件及目录 (ls内定将文件名或目录名称开头为"."的视为隐藏档,不会列出) -l 除文件名称外,亦将文件型态.权 ...
- iOS仿今日头条滑动导航
之前写了篇博客网易首页导航封装类.网易首页导航封装类优化,今天在前两个的基础上仿下今日头条. 1.网易首页导航封装类中主要解决了上面导航的ScrollView和下面的页面的ScrollView联动的问 ...
- EntityFramework CodeFirst 学习
个人学习笔记仅供分享,如有错误还请指出 demo结构:models类库和控制台程序 1.首先在model中建立,ADO.NET 实体数据模型---空模型,然后新建数据实体,并且生成数据库 2.控制台想 ...
- 安装node.js webkit环境[一]
1. 安装node,设置代理npm config set registry https://registry.npm.taobao.org[cmd运行]2. 安装grunt-cli: npm inst ...