const需要在类外初始化吗_static与const是啥玩意儿?又有什么联系?

static的mean->静态

首先要了解一下对象的生存期

  • 静态生存期
    • 与程序的运行期是一致的,具有全局作用域的
    • 只需要在函数体内加关键字static,就变成了整个文件作用域
  • 动态生存期
    • 起始于你定义的的位置,终止于最近的“}”

下面举半个的栗子

```

void other(){
    static int a = 2;//静态局部变量,具有全局作用域,再次进入other()不会再次被初始化了
    int b = 4;//动态局部变量,再次进入other()再次被初始化
    cout << a << 't' << b << endl;
}
int main(){
    static int a;//静态局部变量,具有全局寿命,当然,尽量不要与other()重名
    other();
    other();//多次调用other()
    cout << endl;
    return 0;
}

```

我的朱同学这样说的:static其实你可以理解为一个标识符,就是它给一个数据打了标签,说“老子”不是一般的数据,一般人不能改!

我翻译一下文明版本的:设计static,就是为了只可以让指定的函数或者指定的类才可以修改static修饰的变量,然后在main()可以想用就用它。

那么,在类中如何使用static呢?

使用static声明,为所有对象共享的变量,仍是静态生存期,具有全局寿命。

需要注意的是:~声明,要放在类内(.hpp);~定义和初始化,要放在类外(.cpp),记得用(::)指明所属的类。

下面再举半个的栗子

```

class Point {
    static int count;//记录点的个数
};
#include "111.hpp"
int point::count = 0;//初始化
Point::~Point(){
    count--;
}

```

此处还需要引用朱同学的话:static所修饰的变量,需要专门的函数进行修改;换言之,之所以设定为static,就是不希望别人修改,但是有需要它能够得到改变,不然就直接const常量化。

下面 说一下const

const的mean->常

官方课程称之为共享数据的保护(const修饰,必须进行初始化)(你都不让它再别赋值了,难道还不得给他个初值嘛,是吧)

const也分几类:

  • 常对象
  • 常成员
    • 常函数成员
    • 常数据成员
  • 常引用

【常对象】顾名思义,就是初始化后不能别你修改的对象成员,学生1(科比,24号,男),科比这个对象就只能别调用,或者拷贝给其他对象。

下面再举半个的栗子 ,说明一下格式规定:

```

class Student {//学生类
};
int main(){
    Student const S1(‘科比’, 23, ‘男’);//常对象S1
    cout << endl;
    return 0;
}

```

【常函数成员】其实,const在这里就是一个C++中的一个审查机制,就是说,我本来让Showinfo()不改变变量的值,const修饰后,编译器就帮我仔细的检查一下,是否有变量被修改,有的话,就给你来个红牌警告,没有的话,就说明如你所愿,Showinfo()并没有改变任何变量的值。

按照官方的说法,就是说,绝不改变对象的状态。

假如你确定这个函数中,不会改变变量的值,你就加一个const,又不会怀孕。还能说明你是个好男人,承诺不变心 。

下面再举半个的栗子 ,说明一下:

```

class Student {
    string m_name;
    int m_num;
    string m_sex;
public:
    void Showinfo();
    void Showinfo() const;//其实,有了const这里就没必要写Showinfo()
};
//.cpp
void Student::Showinfo(){
    cout << Getname() << Getnum() << Getsex() << endl;
}
void Student::Showinfo()const{
    cout << Getname() << Getnum() << Getsex() << endl;
}
//.cpp
int main(){
    Student S1(‘科比’,24, ‘男’);
    S1.Showinfo();//调用了void Showinfo()
    const Student S2(‘詹姆斯’,23, ‘男’);//常对象S2
    S2.Showinfo();//调用了void Showinfo() const
    cout << endl;
    return 0;
}

```

常对象,只能调用常函数呦呦^_^

【常数据成员】

这里也就是强调初始化的问题,在哪里初始化?不是你想在哪初始化,就可以初始化的,C++机制规定:普通常数据成员,在初始化列表,不能在函数体;静态常数据成员呢,直接在.cpp初始化。

给大家上半个的栗子

```

class Student {
    string m_name;
    int m_num;
    string m_sex;
    const int m_a;//在main()初始化,仅对单一成员有效
    static const int m_b;//静态成员,所有对象共享
public:
    void Showinfo();
    void Showinfo() const;
};
//.cpp
const int m_b = 12;
Student::Student(int a):m_a(a){}
void Student::Showinfo(){
    cout << Geta() << Getb() << endl;
}
//.cpp
int main(){
    S2.Showinfo();
    Student S3(22), S4(0);//初始化了常成员m_a,S3,S4的m_a以后就没法改变了
    S3.Showinfo();
    S4.Showinfo();
}

```

假如不是常成员,我们就可以在函数体内初始化,也可以在初始化列表内初始化。

【常引用】一种保护私有成员的机制,就是为了加速程序读取速度。

声明引用,数据就可以实现双向传递;

声明常引用,需要加const修饰,只读指定对象的内容,不能修改实参。

```

class Student {
    int m_x, m_y;
public:
    friend int xy(const Student&, const Student&);
};
//.cpp
int xy(const Student& S1, const Student& S2){
    int x = S1.m_x - S2.m_x;
    int y = S1.m_y - S2.m_y;//只能直接访问m_x, m_y,但你不能修改m_x, m_y,达到了保护数据的目的
}

```

本人技术水平有限,若有错误或不当之处,可以在本号内反馈给我,一起交流一起学习!

大家可以加我的个人号,一起讨论。

94438a78085cfc3e017b559c1399c4a0.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值