const:

1 定义变量 ,如下写法都可以:

TYPE const ValueName = value;
                 const TYPE ValueName = value;

2 当作为全局变量并且在他文件也想使用时:(默认const具有局部性)

1.CPP  :extern const TYPE ValueName = value;定义

2.CPP:  extern const  TYPE ValueName; 外部声明

上面两个const 和TYPE可以颠倒。

3 指针使用const

如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
         如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。

4 函数参数中返回值中用const

5 类与const:
    class A
    {
        …
        const int nValue;        //成员常量不能被修改
        …
        A(int x): nValue(x) { } ; //只能在初始化列表中赋值

void function()const; //常成员函数, 它不改变对象的成员变量.

//也不能调用类中任何非const成员函数。

}

1)修饰成员变量:表示成员常量,不能被修改,同时它只能在初始化列表中赋值。

2)const成员函数不被允许修改它所在对象的任何一个数据成员,函数中可以使用非const成员变量,但不能修改。 不能调用类中任何非const成员函数。(因为任何非const成员函数会有修改成员变量的企图。)const成员函数声明和定义const都不能少

3)const类对象、指针、引用:只能调用类的const成员函数,可以使用成员变量,但不能改变值。因此,const修饰成员函数的最重要作用就是限制对于const对象的使用。

class A
{
public:
const int nValue; //成员常量不能被修改
int m_a; A(int x,int a): nValue(x) { m_a=a;} ; //只能在初始化列表中赋值 void func()const; //常成员函数, 它不改变对象的成员变量. //也不能调用类中任何非const成员函数。
}; void A::func() const
{
cout<<m_a<<endl;
cout<<nValue<<endl;
}
int main()
{
const A aa(,);
cout<<aa.m_a<<endl;
aa.func();
return ;
}

补充:const与宏区别:

#define PI 3.14159         //常量宏
const doulbe  Pi=3.14159;  //此时并未将Pi放入ROM中
              ......
double i=Pi;   //此时为Pi分配内存,以后不再分配!
double I=PI;  //编译期间进行宏替换,分配内存
double j=Pi;  //没有内存分配
double J=PI;  //再进行宏替换,又一次分配内存!

static:

class MyTestClass
{
public:
MyTestClass() : m_ciInt(), m_csStr("MyStr") // const成员变量,在ctor参数列表中初始化
{}
public:
const int m_ciInt;
const string m_csStr;
static int m_siInt;
static string m_ssStr;
const static int m_csiInt;
const static string m_cssStr; static void func();
};
int MyTestClass::m_siInt = ; // static成员变量,在外部定义
string MyTestClass::m_ssStr = "MyStr"; // static成员变量,在外部定义
const int MyTestClass::m_csiInt = ; // const static/static const成员变量,在外部定义
const string MyTestClass::m_cssStr = "MyStr"; // const static/static const成员变量,在外部定义 void MyTestClass::func()
{
cout<<m_siInt<<m_ssStr<<m_csiInt<<m_cssStr<<endl;
}
int main()
{
MyTestClass myclass;
myclass.func();
MyTestClass::func();
return ; }

一般这么初始化就可以了,高版本编译器支持类声明中 const static int m_csiInt=5;//常量声明式。

通常C++要求你对所使用的任何东西提供一个定义式,但如果是类的const static 且为整数类型(int,char,bool)
则可以“in_class初值设定”。只要后续使用中不取它们的地址,就可以这么声明后无需提供定义式。如果需要定义式,在类外:

const int MyTestClass::m_csiInt;//不可以再设初值。

注意:static成员变量外部定义不可以出现static关键字。

静态变量和静态函数存在的意义?

答:类中静态函数意义:(类外定义不能写static关键字)

1静态私有成员在类外不能被访问,可通过类的静态成员函数来访问;

2 当类的构造函数是私有的时,不像普通类那样实例化自己,只能通过静态成员函数来调用构造函数。(单例模式)

普通静态函数,静态变量作用:限定了只能在本文件中使用。

静态成员变量和静态成员函数都是为类所拥有,只有一份。静态变量保存在静态存储区。

inline:C++类中使用

三种内联函数形式:1 默认内联函数 2 显示定义内联函数 3 类外定义为内联函数

class Student
{
  private:
    int nID
int
nAge;
    float fScore;
  public:
    void setID(int nid){ nID = nid; }    //该成员函数默认自动为内联函数(隐式定义内联函数)
    inline void setAge(int nage) { nAge = nage; }   //显式定义内联函数
    void setScore(float fscore);         //类定义体内没有声明为内联函数;
}
inline void Student::setScore(float fscore){ fScore = fscore; } //类定义体外实现为内联函数;

由于内联函数是编译器在便宜阶段进行函数体展开的,所以,这就把类的内联函数的定义与实现都必须在声明类的那个头文件中,而不能放在实现类的那个cpp文件中;这一点与模板template<>的特性相似;

const ,static,inline的更多相关文章

  1. Effective C++ 第二版 1)const和inline 2)iostream

    条款1 尽量用const和inline而不用#define >"尽量用编译器而不用预处理" Ex. #define ASPECT_R 1.653    编译器永远不会看到AS ...

  2. Effective C++ 条款02:尽量以const,enum,inline替换 #define

    换一种说法就是宁可以编译器替换预处理器 举例 #define ASPECT_RATIO 1.653 记号ASPECT_RATIO也许从未被编译器看见:也许在编译起开始处理源码前它就被预处理器移走了,于 ...

  3. 条款一:尽量使用const、inline而不是#define

    #define ASPECT_RATIO 1.653 编译器会永远也看不到ASPECT_RATIO这个符号名,因为在源码进入编译器之前,它会被预处理程序去掉,于是ASPECT_RATIO不会加入到符号 ...

  4. Book. Effective C++ item2-尽量使用const, enum, inline替换#define

    ##常规变量 c++里面的#define后面的定义部分,是不算代码的一部分的.所以如果你使用#define: #define ASPECT_RATIO 1.653 你希望这个代号ASPECT RATI ...

  5. const,static,extern 简介

    const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...

  6. 李洪强iOS经典面试题155 - const,static,extern详解(面试必备)

    李洪强iOS经典面试题155 - const,static,extern详解(面试必备) 一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽 ...

  7. static inline

    今天看到了这样一段代码, static inline BOOL IsEmpty(id thing) { return thing == nil || [thing isEqual:[NSNull nu ...

  8. const, static and readonly

    const, static and readonly http://tutorials.csharp-online.net/const,_static_and_readonly Within a cl ...

  9. 类内const static(static const)成员变量初始化问题

    在查找const相关资料的过程中,又遇到了另外一个问题,就是C++类中const static(或者static const)成员变量应当如何初始化的问题. 查阅了许多资料,发现VC环境下,只允许co ...

随机推荐

  1. [ACM_动态规划] ZOJ 1425 Crossed Matchings(交叉最大匹配 动态规划)

    Description There are two rows of positive integer numbers. We can draw one line segment between any ...

  2. JSLint JavaScript代码质量审查工具汉化中文版隆重发布

    JSLint是一款JavaScript代码质量审查工具,它可以指出代码中错误.不规范的地方,非常之严格,甚至多写一个空格都会发出警告. JSLint的审查规则,根据众多前辈多年编程经验而写,字字珠玑, ...

  3. MySql查询数据库的大小

    第一步:首先打开Mysql命令行,通过开始菜单-程序-MySql-Command line client,如图1-1所示: 图1-1 第二步:在命令中输入use information_schema ...

  4. PHP将XML转成数组

    如果你使用 curl 获取的 xml data$xml = simplexml_load_string($data);$data['tk'] = json_decode(json_encode($xm ...

  5. asp.net core中Microsoft.AspNet.Session的使用

    1.通过nuget/修改project.json引用 2.引用存储session的媒介,如内存.数据库.redis等 "Microsoft.AspNetCore.Session": ...

  6. javaweb学习总结(二十六)——jsp简单标签标签库开发(二)

    一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段, ...

  7. .NET Framework各版本汇总以及之间的关系

    目录(?)[-] 原文链接:http://blog.csdn.net/kingmax54212008/article/details/25886345 NET Framework 版本关系 获取NET ...

  8. Leetcode 234 Palindrome Linked List 链表

    判断链表是否是回文. 我直接将链表的一半进行倒置,然后将两半的链表进行比较 /** * Definition for singly-linked list. * struct ListNode { * ...

  9. Leetcode 225 Implement Stack using Queues STL

    用两个队列去实现栈,这里我使用了队列数组q[2],在所有的过程中保证一个队列是空的 push时插入到空的队列中,然后将队列中的元素移到另一个队列中 pop时从不空的队列中pop() peek时从不空的 ...

  10. PowerManager和WakeLock的操作步骤

    ①  PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);通过 Context.getSystemServ ...