C++设计语言三大难点

来源:互联网 发布:收购淘宝店铺有什么用 编辑:程序博客网 时间:2024/06/02 19:50

预处理问题、const问题、sizeof问题
1、宏定义 #define
(1) 简单的宏定义:

define <宏名> <字符串>

例: #define PI 3.1415926
(2) 带参数的宏定义

define <宏名> ( <参数表>) <宏体>

在使用简单宏定义时,当字符串中不只一个符号时,加上括号表现出优先级;如果是 带参数的宏定义,则要给宏体中的每个参数加上括号,并在整个宏体上再加一个括号。

宏是替换,在编译开始之前。先替换再计算。
表明一年有多少秒 #define seconds_per_years (60*60*24*365)UL
求两个参数并返回比较小的值#define min(x,y) ((x)<=(y)?(x):(y))
把参数用括号括起来,并且在最终的宏体上再加一层括号。

2、const
a、关于const修饰指针的情况,一般分为如下4种情况:

int b = 500;const int* a = &b; //情况1int const *a = &b; //情况2int* const a = &b; //情况3const int* const a = &b;//情况4

情况1
const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
const位于星号的右侧,则const就是修饰指针本身,即指针本身是常量
因此情况1和情况2相同,都是指针指向的内容为常量,这种情况下不允许通过指针对内容进行更改操作,但是可以对指针本身进行更改操作。
情况1和2:*a = 600是非法的,a = &c是合法的。

情况3指针本身是常量,不能对指针本身进行更改操作,而指针指向的内容不是常量,可以通过指针对内容进行更改操作。这种情况下指针必须被初始化。
情况3:*a = 600是合法的,a=&c是非法的
对于情况4:指针本身和指向的内容均为常量,那么指针本身不能改变,指针指向的内容也不能改变。

b、const成员函数
我们定义的类成员函数中,常常有些成员函数不改变类的数据成员,也就是说这些函数是只读函数。使用const可以提高程序可读性和健壮性。

int gety() const;//const放在函数声明后。放在函数声明前意思是返回值是const,意义不同

如果想通过const成员函数修改类成员变量数据,可以使用mutable修饰变量mutable int m_count;

3、sizeof运算符
指针:指针大小是定值,4字节
字符:1字节
int:4字节
float:4
double:8
结构体:当长度小于处理器位数的时候(64位,8字节)一定是最长数据元素的整数倍;当长度大于处理器位数的时候,是位数的整数倍。
数组做sizeof的参数不退化成指针,仍然计算的是数组内容、不支持动态分配的数组

一个空类所占空间是1,多重继承的空类所占空间也是1.

1 0
原创粉丝点击