C++知识点随笔(三):static、const、friend、inline

原创 2015年07月07日 09:24:18

一、static

静态成员属性为什么要在类外初始化?
静态成员属性之所以不能在构造函数内初始化,是因为构造函数必须要在定义对象的时候才会调用,而static变量在编译的时候就创建了,所以要在类外通过类名作用域对static成员属性初始化。

注意:sizeof()在C++中和C语言有不同,当我们:

cout << sizeof(//类名) << endl;

的时候,不是输出这个类的大小,而是输出定义一个这个类的对象需要申请多大的空间,所以如果这个类里包含了静态成员都不会计算在sizeof()内的,因为静态成员一个类只有一份儿,所以的对象共用他们。

struct Node
{
    int age;
    char c;
};

class CPeople
{
public:
    int pp;
    static const int qq = 100;   //静态常量整形数据成员才能在类内初始化
    static Node node[2];
    static int num;    // 静态成员一定要在类外初始化
public:      //相当于全局变量,在编译的时候就申请空间了,不用对象也能调用,(类名::)
    CPeople()
    {
        pp = 100;
    }
    //  静态成员函数:不能用普通的成员属性,只能用 static 成员,因为没有this指针
    static void Show()
    {
        //cout << this->pp << endl;     
        cout << num << endl;
        cout << "static::show" << endl;
    }
};
Node CPeople::node[2] = {{123,'d'},{456,'y'}};  //静态结构体数组初始化
int CPeople::num = 123;   //静态成员的初始化

注意:静态常量整形数据成员才能在类内初始化。所以short、long、char都可以,但是float、double不可以。

二、const

非静态const成员属性为什么一定要在初始化列表里进行初始化?
在C中我们知道#define进行预定义的某个数是被分配内存的,其文件在编译预处理过程中就会用定义好的数据去替代文中的符号。但是const却是不一样的,一般情况下编译器也是不为const创建空间的,只是将这个定义的数字保存在符号表中的。所以C++中const是在编译的时候定义的,但是它的初始化可以在调用构造函数(也就是创建对象)的时候通过初始化列表的方式进行。调用构造函数的时候,首先是给该实例(类的具体对象)分配空间。使用初始化列表的话,就在分配空间的时候,同时将其空间初始化。但在构造函数的大括号里,所有变(常)量的空间都已经分配好了,进行赋值操作。我们知道const是常量,只能进行初始化操作而不能进行赋值操作,所以必须在初始化列表中分配空间的同时进行初始化操作。

还有一个赋值次数,效率上的区别,初始化列表在对象初始化时对成员变量赋值一次,而使用构造函数内直接赋值的话,对成员变量赋值两次,一次是对象构造是用默认值进行赋值,第二次是调用构造函数赋值。因为普通成员变量是否初始化都可以,而且允许赋值操作,所以普通成员变量既可以使用初始化列表又可以使用构造函数赋值。

参考:http://blog.csdn.net/zhouyelihua/article/details/23252667

const成员函数

void Show(/*const CPeople* this*/) const   // 常函数,不能修改类中的成员属性
{                               
    //this->a = 100;   //错误,因为 this 已经变成 const CPeople* this
}

常量类型的对象:

const CPeople pep;

只能调用常函数,普通函数用不了,因为我们知道成员函数在使用的时候要把对象的地址传进去,而我们用常量对象调用普通成员变量的时候,相当于:

void AA(/*CPeople* this = const CPeople* ll*/)
{
    a = 567;
}

一定会报错的。而const成员函数的this已经变了,所以常量对象可以调用const成员函数。反过来普通对象可以调用常函数。

三、friend

friend class BB;                // 友元类
friend void Show(CPeople pp);   // 友元函数,可以让这个东西用自己的private成员

无论是友元类还是被友元类,都不能继承这个友元关系。友元的友元也不能使用。友元就是只限定这一个可以用

类的封装性问题
友元函数是破坏类的封装性的最大杀手。我们在使用成员函数返回类的私有成员属性的时候也是很危险的,如果一定要使用的话,就将返回值设为const。

四、inline

void AA()    // 类内实现的都是内联函数(默认的)
{
    cout << "AA" << endl;
}
/*inline */void BB();    //  不是内联的 
inline void BB();    //  内联的

不过编译器自己也会有判断,其实声明为inline只是对编译器提出一个建议,建议编译器进行内联,而具体会不会内联,由编译器决定,编译器会综合考虑更方面因素来判断要不要进行内联。
内联将函数代码直接在调用的地方展开,而函数调用是一个跳转语句,通过函数指针跳转到函数体的地址,执行完再回来,所以inline是一种用空间换时间的方法。

参考我的另一篇博客:http://blog.csdn.net/u012300157/article/details/46763089

版权声明:本文为博主原创文章,未经博主允许不得转载。

C++中的inline关键字

在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数。 内联函数的引入有利有弊,使用时应当注意。...
  • kaige2111
  • kaige2111
  • 2016年04月29日 11:12
  • 5951

c++中static和inline关键字

一、static变量和static函数 static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?    答: 1) 全局...
  • u011501096
  • u011501096
  • 2014年08月07日 16:39
  • 994

C++中friend的使用

C++中friend的使用
  • fengbingchun
  • fengbingchun
  • 2016年06月23日 22:11
  • 5072

C++ friend 用法总结

C++中的友元机制允许类的非公有成员被一个类或者函数访问,友元按类型分为三种:普通非类成员函数作为友元,类的成员函数作为友元,类作为友元。 1 友元的内容 友元包括友元的声明以及友元的定义。友元的声明...
  • zhuhuangtianzi
  • zhuhuangtianzi
  • 2014年07月22日 23:48
  • 11619

C++中static、const、static const修饰变量作用详解

C++中类的变量可以通过static、const、static const来修饰,不同的修饰在不同的情况下表示不同的含义。下面7少带大家一块详细解读一下他们的用处。 首先我们需要先了解程序运行期间的...
  • sevenshal
  • sevenshal
  • 2013年06月25日 23:04
  • 5096

关于头文件中的 static inline函数

关于头文件中的 static inline函数     头文件中常见static inline函数,于是思考有可能遇到的问题,如头文件经常会被包含会不会产生很多副本?网上说法不一。于是自己验证。经过...
  • huanghui167
  • huanghui167
  • 2014年11月21日 11:48
  • 17445

C++中const 、static、 static const和const static的初始化以及修改问题

转载自  http://blog.bccn.net/zpcdbc/categories/119746 一、const、static、static const、const static变量...
  • bjyddxhfxq
  • bjyddxhfxq
  • 2016年04月20日 10:53
  • 662

C++ static、const和static const类型成员变量声明以及初始化

C++ static、const和static const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间。 st...
  • u012543266
  • u012543266
  • 2013年11月03日 22:07
  • 18304

Linux内核定时器

人们习惯用于表示时间的方法是:年、月、日、时、分、秒、毫秒、星期等等,但是在内核中,为了软件逻辑和代码的方便性,它使用了一些不同的时间表示方法,并为这些表示方法定义了相应的变量和数据结构,本节的内容就...
  • lin2jian4liang4
  • lin2jian4liang4
  • 2015年10月24日 11:33
  • 181

C++带const、static和#define关键字的变量定义的区别

一、const  1.变量定义中    (1)const int a=10;    说明:定义的int型变量a不能被修改,只能被使用。带const关键字的变量可以定义为全局变量,但此时定义的全局...
  • xingkongfenqi
  • xingkongfenqi
  • 2015年07月04日 21:35
  • 1274
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++知识点随笔(三):static、const、friend、inline
举报原因:
原因补充:

(最多只允许输入30个字)