美文网首页
那些你不知道的C++的“坑”

那些你不知道的C++的“坑”

作者: 会飞的猪cy | 来源:发表于2017-10-12 17:59 被阅读0次
  • 局部静态变量
    首先我们来看两个例子
#include <iostream>

void func(int i) {
  static int s = i++;
  std::cout << s << std::endl;
}

int main() {
  func(0);
  func(1);
  func(2);
  return 0;
}

单纯的你会以为这段代码输出什么?0,1,2?暂且不管它输出什么,我们再来看下一段代码

#include <iostream>

void func(int i) {
  static int s;
  s = i++;
  std::cout << s << std::endl;
}

int main() {
  func(0);
  func(1);
  func(2);
  return 0;
}

上面两段代码有区别吗?事实上,这两段代码的输出结果完全不同。这两段代码均使用了局部静态变量,C++里面局部静态变量只初始化一次,说到这里有没有似乎明白了什么。第一种写法,由于静态变量s只初始化一次,故func(1),func(2)并没有初始化s,输出0,0,0;第二种写法, 每次调用函数并不是给静态变量初始化,而是赋值,故输出0,1,2;如此的细节,你们注意到没。


  • 全局静态变量
    它有以下几种主要的用法:
  1. 隐藏规则,最重要的一条
    当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,我们举例子加以说明。
    i.h文件
int i = 9;

main.cpp文件

#include <iostream>
#include "i.h"
int main() {
  std::cout << i << std::endl;
}

i.h文件中的i变量对所有文件都是可见的。如果把int i = 9;改为static int i = 9;就可以发挥它的隐藏功能了,这时如果main.cpp中的main函数中添加i = 1;则输出结果就为1,因为main.cpp中的i隐藏了static i,静态变量i只对i.h文件可见,因而其他文件可以定义相同名字的变量,而不会发生冲突.

  1. 默认初始化为0
    这个同全局变量一样,未初始化的静态变量会初始化为0。因为全局变量也是存放在静态数据区

  • 静态成员变量
    在类中成员的声明前加上static,该成员是类的静态数据成员.
#include <iostream>

class MyClass{
public:
     MyClass(int a,int b,int c);
     void Get();

private:
    int a,b,c;
    static int sum;//声明静态数据成员
};

int MyClass::sum=0;//定义并初始化静态数据成员

对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当做是类的成员,无论这个类被定义了多少个,静态数据成员都只有一份拷贝,为该类型的所有对象所共享(包括其派生类)。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新。

因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以它不属于特定的类对象,在没有产生类对象前就可以使用.


  • 静态成员函数

与普通的成员函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针。从这个意义上来说,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,只能调用其他的静态成员函数,如果要访问只能通过对象访问,静态成员函数不可以同时声明为 virtual、const、volatile函数。

相关文章

  • 那些你不知道的C++的“坑”

    局部静态变量首先我们来看两个例子 单纯的你会以为这段代码输出什么?0,1,2?暂且不管它输出什么,我们再来看下一段...

  • 写作,那些你不知道的坑

    关于写作,我想说,有许多的时候我们急于求成,想要快速见报,所以就给了许多人可乘之机。网络上的各种报名速成写...

  • 那些你不知道的“廉价航空”的坑

    微信绑定的同程旅行网,其实用起来倒也算顺手。可是前天发生的事儿,让我觉得有必要跟大家一起来聊一聊。 起因是因为给小...

  • 关于C++的四个就业方向,哪个更适合你?

    很多人在学习C++的过程中,不知道自己选择哪个具体就业方向?我们今天就来聊聊关于C++的那些事。 C++语言主要集...

  • 你不知道的那些坑正耗费着你

    66/100#晨间三件事(4.28)#昨日回顾(4.27)图片发自简书App 昨日回顾 事件收获:今天说说我遇到的...

  • PHP中那些你不知道的坑,PHP的坑,PHP漏洞

    知乎上任何关于PHP的话题,最后都会变成引战贴,树大招风就是这样。今天长话短说,聊点干货,助你在知乎的PHP话题上...

  • 时间管理:你不知道的那些坑

    时间管理最近真是太火辣!到处都有很多时间管理专家出书、出网课、出训练营。我也要追上热点,跟大家伙聊聊这个火辣辣的名...

  • 返还型保险那些你不知道的坑

    文:核小桃 【核桃保认知课堂】 最近在核桃保的交流群中经常听到有朋友咨询关于返还型保险的问题,好不好?哪款产品适合...

  • 关于网购,你不知道的那些坑

    网购,简单说之就是在网上在买东西,大家都会觉得很方便,可是买过几次后,有些人发现了弊端,产品毕竟是看得见摸不着的,...

  • stap介绍

    用c++语言做项目,犹如进入了原始森林,内存越界,内存泄漏,库冲突,死锁,程序崩溃,你永远不知道下一个坑是什么...

网友评论

      本文标题:那些你不知道的C++的“坑”

      本文链接:https://www.haomeiwen.com/subject/joroyxtx.html