[C++基础]初始化和宏定义


初始化,宏定义,常函数和静态成员

初始化和赋值的区别

初始化:变量和对象产生的时候赋予一个值,伴随性质

赋值:产生之后赋予一个值,随意性质

数组的赋值只能单个赋值

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不行。初始化列表
    {
    }

avatar
c是局部变量,给b赋值完后,它的值就不存在了
//第二种
CStu(int &c):a(c),b(c)
主函数:

int d=12;
CStu stu(d)

d的作用范围大,一直在
avatar

数组和结构体使用初始化列表

数组

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
}