C++总结----静态成员,const修饰类成员,内联函数超详解

举报
竹叶青 发表于 2019/10/15 20:26:41 2019/10/15
【摘要】 博客链接:https://blog.csdn.net/qq_39412582/article/details/81215272 正文开始: ##一 · 静态成员 ## 我们知道全局变量能够实现数据共享,如果在多个程序文件中有多个函数,每一个函数中都可以来改变全局变量的值,但是这样做是不安全的,如不小心改错就会导致程序崩溃,因此在实际运用中很少用到全局变量。 但是有时候我们就是要用到多个对象之...

top1.86439ad.png

博客链接:https://blog.csdn.net/qq_39412582/article/details/81215272 正文开始: ## · 静态成员 ## 我们知道全局变量能够实现数据共享,如果在多个程序文件中有多个函数,每一个函数中都可以来改变全局变量的值,但是这样做是不安全的,如不小心改错就会导致程序崩溃,因此在实际运用中很少用到全局变量。 但是有时候我们就是要用到多个对象之间实现数据共享,除了全局变量,就是我们今天要提到的静态成员。

 

1.1 静态数据成员

 

class Person

{

private:

         char* _name;

         static char* _gender;    //_gender定义为静态数据成员

         int   _age;

}

 

静态数据成员是一个特殊的数据成员,以static开头。如果希望个对象的数据成员的值是一样的,就可以把它定义为静态数据成员。声明为静态数据成员有个好处就是它只占用一分内存空间,而不是每个对象都为它留下一块空间。

 

对于静态成员函数作以下几点说明: ⑴前面说过,如果只申明类而未定义对象,则类的一般数据成员是不占空间的,只有在定义对象时,才会为对象的数据成员分配空间。但是静态数据成员不属于某一个对象,在为对象所分配的空间中不包括静态数据成员所占的空间,它是在对象之外单独开辟空间,只要定义了静态成员变量,即使不定义对象,也会为其分配空间还能被引用。 ⑵静态数据成员既然不会随着对象的建立而分配空间,那么自然也不会随着对象的撤销而释放。静态数据成员是在程序开始运行时被分配空间,到程序结束时才会释放空间。 ⑶静态数据成员只能在类外进行初始化。

 

char* Person::_gender ="man"

要注意的是不能用参数初始化表来对静态数据成员初始化: {:--} ⑷静态数据成员既可以通过对象名引用还可以通过类名引用:

 

class Person

{

public:

         Person(char* name, char* gender, int age)

                   :_name(name)

                   , _age(age)

            {}

         static char* _gender;

private:

         char* _name; 

    int  _age;

};

 

char* Person::_gender = "man";

 

int main()

{

         Person p("Peter", "man", 18);

         cout << Person::_gender << endl;

         cout << p._gender << endl;

         return 0;

}

{:--}

 

 

如果静态数据成员定义为私有的,就不能在类外直接引用,而必须通过公有函数进行引用。

 

class Person

{

public:

         Person(char* name, char* gender, int age)

                   :_name(name)

            {}

         static char* _gender;

         int PersonAge();

private:

         char* _name; 

         static int  _age;

};

 

char* Person::_gender = "man";

 

int Person::PersonAge()

{

         return _age=18;

}

⑸与全局变量不同的是,静态数据成员的作用域只限于定义该类的作用域中,在类的作用域中可以通过类名和域运算符“::”来进行引用

 

2 静态成员函数 和静态数据成员一样,成员函数也可以是静态的,在类里声明的函数名前加上**static”就成了静态成员函数,它是类的一部分而不是对象的一部分。如果在类为引用静态成员函数需要用类名和域运算符“::**。如:

 

Person::PersonAge();

实际上也可以写成:

 

p.PersonAge();

但这并不能说这个函数是属于对象p的,而是只能说用了p的类型而已。 当调用一个对象的成员函数数时(非静态成员函数),系统会把该对象的起始地址赋给成员函数的this指针。而静态成员数不属于对象的成员函数,与任何对象无关,因此静态成员函数没有this指针。既然没有指向某一对象,就无法对一个对象里的非静态成员进行默认访问(即在引用数据成员时不指定对象名)----面试题。

 

静态成员函数可以直接引用本类中的静态成员,我们给个例子再来说明一下:

 

class Box

{

public:

    Box(int length,int width,int height)

        : _width(width)

        , _height(height)

    {}

    static void volume();     //静态成员函数

private:

    static int _length;

    int _width;

    int _height;

};

void Box::volume()

{

    //cout<<_width<

本文转载自异步社区

原文链接:

https://www.epubit.com/articleDetails?id=N1825e49f-3229-4ad7-929a-ff011a7549be


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。