首页 > 其他分享 >static 关键字

static 关键字

时间:2023-11-16 18:47:29浏览次数:33  
标签:uninitialized Widget int 关键字 static cpp ptr

title: static keyword
layout: page
categories: cpp

static keyword

编译器信息:

╰─>$ clang++ --version 
Apple clang version 15.0.0 (clang-1500.0.40.1)
Target: arm64-apple-darwin23.1.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

https://en.cppreference.com/w/cpp/language/static (最全——但是记不住)

https://learn.microsoft.com/en-us/cpp/cpp/storage-classes-cpp?view=msvc-170

https://zhuanlan.zhihu.com/p/348026261

讨论 static 修饰四种变量的情况:

全局变量

  • Internal linkage, 内部链接,
    • 仅能在当前文件 (translation unit) 内部访问;
  • 初始化为 0 , 除非另有指定;
  • 存储在 data segment 上,既不是 stack 也不是 heap;

https://upload.wikimedia.org/wikipedia/commons/5/50/Program_memory_layout.pdf

指针

全局指针

static int* uninitialized_ptr;

int main() {
    Widget wid;
    print(uninitialized_ptr);
    return 0;
}
Address: 0x0

局部指针

int main() {
    static int* uninitialized_ptr;
    print(uninitialized_ptr);
    return 0;
}
Address: 0x0

类中的静态成员函数

功能上,以下两种写法没有什么区别:

class Widget {
public:
	static void someFunction();
    static void otherFunction();
};
namespace Widget {
	void someFunction();
    void otherFunction();
}

类中的静态成员

  • 只会有一份拷贝,无论创建多少对象,都只会有一个副本;
  • 要求初始化,否则报错
class Widget {
public:
    static int data;
    static int* some_ptr;
};

int Widget::data = 0;
// int* Widget::some_ptr = &some_val;
ld: Undefined symbols:
  Widget::some_ptr, referenced from:
      _main in test-b2d8d2.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)
  • 初始化的时候就不需要 static 关键字了
  • 严格上表现得不像是一个「成员」,因为
    • 不可以调用 this来访问静态成员
    • 使用 :: 来访问而不是 .

标签:uninitialized,Widget,int,关键字,static,cpp,ptr
From: https://www.cnblogs.com/kion/p/17836994.html

相关文章

  • C语言中的关键字
    C语言中有32个关键字,关键字不能用作变量名、函数名、数组名等标识符。关键字的作用是用于定义变量、函数、结构体、联合体等。需要注意,这些关键字都是小写的。这些关键字分别是:auto:自动变量,用于定义自动变量。break:跳出循环,用于跳出循环。case:用于switch语句中,表示某个值......
  • 【你不知道的JavaScript】this关键字
    没有this时,需要传入上下文获取name,在多个上下文时,代码变得繁杂重复varme={name:"Kyle"};varyou={name:"Reader"};functionidentify(context){returncontext.name.toUpperCase();}functionspeak(context){vargreeting="Hello,I&......
  • static、final、private是否可以修饰抽象方法?
    1、static和abstract:是不能共存的。static是为了方便调用,abstract是为了给子类重写,没有方法体。2、final和abstract:是互相冲突的,final修饰的方法不能重写,而abstract修饰的方法就是为了让子类重写的。3、private和abstract:也是冲突的,private修饰的方法不能被继承,也就是不能够被重......
  • java 面向对象进阶 static
    1.工具类packagenet.elaina.a02staticdemo2;publicclassArrayUtil{//私有化构造方法//目的:为了不让外界创建他的对象privateArrayUtil(){}//需要定义为静态的,方便调用publicstaticStringprintArr(int[]arr){StringB......
  • 常用SQL关键字
    单表查询:like模糊匹配例:namelike'%keyword%',全模糊匹配namelike'keyword%',后模糊匹配 字段取别名as distinct过滤字段重复数据行 selectdistinctnamefromtableselectdistinctname,idfromtable groupby分组 orderby排序,默认升序(ASC),降序DESC,......
  • final关键字的作用
    目录1.修饰类时2.修饰方法时3.修饰属性和局部变量时3.1修饰局部变量时3.2修饰成员变量时3.3修饰类变量时4.final与普通变量的区别5.final用于引用1.修饰类时1.只能是公共的(public)就算不写也是public2.被final修饰的类不可以被继承//前面默认有个public写不写都行finalcla......
  • Java中ThreadLocal说明 使用线程内变量,完成后需调用remove()方法将其移除,即使异常也
    Java中ThreadLocal说明,完成后需调用remove()方法将其移除,即使异常也记得remove()回收,创建ThreadLocal线程变量publicstaticThreadLocalthreadLocal=newThreadLocal<>();1、ThreadLocal是什么ThreadLocal,即线程变量,是一个以ThreadLocal对象为键、任意对象为值的存储......
  • Sql Server中Cross Apply关键字的使用
    SqlServer中CrossApply关键字的使用前言在写一个业务的时候,有1列数据如下:车牌号湘A00001/湘G00001湘A00002/湘G00002湘A00003/湘G00003/湘A8888888湘A00004/湘G00004/湘A00001我的查询条件也是车牌号,我会传入如下参数:@PLATE_NO'湘A00003/湘G00003/湘A......
  • c++ extern关键字
    @[TOC]什么是extern?extern是C++中的一个关键字,用于声明一个全局变量或函数,但并不分配内存或提供定义。它的主要作用是告诉编译器这个变量或函数在其他源文件中定义,编译器不应该分配内存空间或生成代码,而应该等待链接器来解析它。使用extern声明变量//在一个源文件中定义一个......
  • class是js关键字,jsx中要用className
    下面的JSX代码中,哪一个无法达到预期的效果?AHelloWorldBC{msg}DLeoEF正确答案:C选cclass是js关键字,这里要用className。对于E选项,在jsx中直接写行内样式时不能采用引号,而是style={{color:'red'}}的方式选择C,在jsx里面,要把class换成className才能正确编译,表......