c++系列文章(7):自定义数据类型

自定义数据类型

  类体右侧的表示结束的花括号后必须写一个分号,这是因为类体后面可以紧跟变量名以示对该类型对象饿定义,所以分号必不可少。分号表示声明符的结束,一般来说,最好不要把对象的定义和类的定义放在一起。

struct Sales_data {} /*......*/} accum,trans,*salesptr;
// 与上一条语句等价,但可能会更好
struct Sales_data {/*......*/};
Sales_data accum,trans,*salesptr;

  C++11规定,可以为数据成员提供一个类内初始值,创建对象时,类内初始值将用于初始化数据成员,没有初始值的成员将被默认初始化。类内初始值的限制:或者放在花括号里,或者放在等号右边,但不能使用圆括号。

编写自己的头文件

  尽管可以在函数体内定义类(称为局部类),但是这样的类毕竟受到一些限制,因此类一般不定义在函数体内。当在函数体外部定义类时,如果要在不同文件中使用同一个类,类的定义就必须保持一致。
  为了确保各个文件中类的定义保持一致,类通常被定义在头文件中,而且类所在头文件的名字应该与类的名字一样,例如库类型string在名为string的头文件中定义。
  头文件通常只包含那些只能被定义一次的实体,例如类、const和constexpr变量。头文件也经常用到其他头文件的功能,因此可能导致重复包含头文件。所以有必要在书写头文件时做适当处理,使其遇到多次包含的情况也能安全和正常地工作。头文件一旦改变,相关的源文件必须重新编译以获得更新过的声明
  位于头文件的代码一般来说不应该使用using声明。这是因为头文件的内容会拷贝到所有引用它的文件中去,如果头文件里有某个using声明,那么使用该头文件的文件就都会有这个声明。对于某些程序来说,由于不经意间包含了一些名字,反而可能产生始料未及的名字冲突。

  预处理器

  确保头文件多次包含仍能安全工作的常用技术是头文件保护符,头文件保护符依赖于预处理变量,预处理变量有两种状态:已定义和未定义。#define指令把一个名字设定为预处理变量,另外两个指令则分别检查某个指定的预处理变量是否已经定义:#define当且仅当变量已定义时为真,#ifndef当且仅当变量未定义时为真。一旦检查结果为真,则执行后续操作直到遇到#endif指令为止。

#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <string>
class Sales_data{
	std::string bookNo;
	unsigned units_sold = 0;
	double revenue = 0.0;
};
#endif

  第一次包含Sales_data.h时,#ifdef的检查结果为真,预处理器将顺序执行后面的操作直到遇到#endif为止。此时,预处理变量SALES_DATA_H的值将变为已定义,而且Sales_data.h也会被拷贝到我们陈序中来。后面如果再一次包含Sales_data.h,则#ifndef的检查结果将为假,编译器将忽略#ifndef和#endif之间的部分。预处理器变量无视C++语言中关于作用域的规则
  整个程序中的预处理变量包括头文件保护符必须唯一,通常的做法是基于头文件中类的名字来构建保护符的名字,以确保其唯一性。为了避免与程序中的其他实体发生名字冲突,一般把预处理变量的名字全部大写。

发布了19 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/hjc132/article/details/104407972