今日计划:看阿秀八股到35
宏定义
宏定义是比较常用的预处理指令,即使用“标识符”来表示“替换列表”中的内容。
宏定义不是语句,是预处理指令,故结尾不加分号。
当替换列表一行写不下时,可以使用反斜线\作为续行符延续到下一行
#define PI 3.1416 //正确,该行#前允许有空格
int a;#define N 5 //错误,该行#前不允许有空格外的其他字符
删除宏定义的格式为:#undef 标识符
标识符与参数表的左括号之间不能有空格,否则预处理器会把该宏理解为普通的无参宏定义
大小端
大端存储:数据的高字节存储在低地址中,数据的低字节存储在高地址中
应用:C51是大端存储;socket编程中网络字节序一般是大端存储
小端存储:数据的高字节存储在高地址中,数据的低字节存储在低地址中
应用:x86结构、ARM和DSP都是小端存储
详解大端模式和小端模式 - 简书 (jianshu.com)
const类成员变量、const成员函数
类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变。
在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函数不能加 const。
有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员;没有 const 修饰的成员函数,对数据成员则是可读可写的。
常量(即 const)对象可以调用 const 成员函数,而不能调用非const修饰的函数。
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
class A
{
public:
void f()
{
cout<<"non const"<<endl;
}
void f()const
{
cout<<" const"<<endl;
}
};
int main(int argc,char **argv)
{
A a;
a.f();
const A &b=a;
b.f(); //如果只有const成员函数,非const对象
const A *c=&a; //是可以调用const成员函数的。
c->f(); //当const版本和非const版本的成员函数同时出现时,
A *const d=&a; //非const对象调用非const成员函数。
d->f();
A *const e=d;
e->f();
const A *f=c;
f->f();
return 0;
}
在C++中,只有被声明为const的成员函数才能被一个const类对象调用。
const成员函数可以被对应的具有相同形参列表的非const成员函数重载
static类成员、static类成员函数
static类成员不像普通的类数据成员,static类数据成员独立于一切类对象处在。static类数据成员是与类关联的,但不与该类定义的对象有任何关系。static类成员不像普通的类数据成员,static类数据成员独立于一切类对象处在。static类数据成员是与类关联的,但不与该类定义的对象有任何关系。
即:static不会想普通类数据成员一样每一个类对象都有一份,全部类对象是共享一个static类成员的
static类对象必须要在类外进行初始化
所有对象共享一个static类成员
static修饰的变量先于对象存在,所以static修饰的变量要在类外初始化。因为static是所有对象共享的东西嘛,必须要比对象先存在的。
static类成员函数
由于static修饰的类成员属于类,不属于对象,因此static类成员函数是没有this指针的,this指针是指向本对象的指针。正因为没有this指针,所以static类成员函数不能访问非static的类成员,只能访问 static修饰的类成员。