初始化,宏定义,常函数和静态成员
初始化和赋值的区别
初始化:变量和对象产生的时候赋予一个值,伴随性质
赋值:产生之后赋予一个值,随意性质
数组的赋值只能单个赋值
int b[12];
b[0]=1;
b[1]=2
引用和const一定要初始化
初始化列表
class CStu
{
public:
int a;
float f;
//第一种
CStu():a(12),f(12.23f)//初始化列表
{
}
//第二种
CStu(int b,float c):a(b),f(c)//初始化的顺序只和声明顺序有关,和书写顺序无关
{
}
//第三种
CStu():a(12),f(a)//成员间的初始化,f和a要一个类型
{
}
}
引用和const初始化
class CStu
{
public:
int b;
int &a;
//第一种
CStu(int c):a(b),b(c)//a(c),b(c)这样赋值不行,在构造函数可以输出,但main不行。初始化列表
{
}
c是局部变量,给b赋值完后,它的值就不存在了
//第二种
CStu(int &c):a(c),b(c)
主函数:
int d=12;
CStu stu(d)
d的作用范围大,一直在
数组和结构体使用初始化列表
数组
int a[4];
//第一种
CStu():a()//输出都为0,但不是所有编译器都允许
//第二种
CStu()
{
for(int i=0;i<4;i++)
{
a[i]=0;
}
}
//第三种
CStu()
{
memset(a,0,16)//16:占4*4个字节
}
结构体
1.
struct STU
{
int i;
float f;
};
结构体可以直接赋值 在main函数:
STU st={1,12.23f};
STU st1=st//结构体可以这样赋值
2.有疑问
在类里调用一个结构体
STU st;
CStu(STU sd):st(sd)
{
}
在main函数里
STU sf={12,12.12f}
CStu stu(sf)
宏定义
用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本
(1)简单的宏定义:
#define <宏名> <字符串>
例: #define PI 3.1415926
(2) 带参数的宏定义
#define <宏名> (<参数表>) <宏体>
例: #define A(x) x
如果是自己编程使用宏替换,则在使用简单宏定义时,当字符串中不只一个符号时,加上括号表现出优先级,如果是带参数的宏定义,则要给宏体中的每个参数加上括号,并在整个宏体上再加一个括号。看到这里,不禁要问,用宏定义这么麻烦,这么容易出错,可不可以摒弃它, 那让我们来看一下在C语言中用宏定义的好处吧。
常函数
int a;
void show()const
{
a=12;//报错,常函数不能修改数据成员
int b=12 //内部允许这样
}
常对象:
const CStu stu
只能调用常函数,不能调用普通函数
静态成员
static int a;
static void fun();
类外初始化,静态成员受private修饰
类外:
int CStu::a=13//类外不用加static
输出:
cout<<CStu::a<<endl
//或者
CStu st;
st.a;
静态函数不能调用普通成员
静态成员时其他对象公有的,都可以访问
不使用for循环累加
class CStu
{
public:
static int b;
CStu()
{
b++;
}
}
int main()
{
CStu st[5];//5个对象,调用5个构造函数,b++五次,因为静态成员是共享的
cout<<CStu::b<<endl
}