首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在构造函数中为静态类成员去掉'this‘指针

在构造函数中,静态类成员不需要使用'this'指针来访问。静态成员是属于类本身的,而不是属于类的实例。因此,在构造函数中访问静态类成员时,不需要使用'this'指针。

静态类成员的特点是它在所有类的实例之间是共享的。它们可以用于存储对于所有类实例都相同的数据或者提供对于所有实例都可用的功能。

下面是一个示例代码:

代码语言:txt
复制
class MyClass {
public:
    static int staticMember; // 静态成员变量

    MyClass(int x) {
        // 构造函数
        staticMember = x; // 访问静态成员变量
    }

    static void staticMethod() {
        // 静态成员函数
        // 可以直接访问静态成员变量
    }
};

int MyClass::staticMember = 0; // 静态成员变量的初始化

int main() {
    MyClass obj1(10);
    MyClass obj2(20);

    // 访问静态成员变量
    cout << MyClass::staticMember << endl;

    // 调用静态成员函数
    MyClass::staticMethod();

    return 0;
}

在上述代码中,我们创建了一个名为MyClass的类,其中包含一个静态成员变量staticMember和一个静态成员函数staticMethod。在构造函数中,我们可以直接访问静态成员变量staticMember,而无需使用'this'指针。

静态成员的优势在于它们可以在类的所有实例之间共享数据,而不需要为每个实例都创建一个副本。这可以节省内存空间并提高程序的效率。

静态成员可以在很多场景中使用,例如记录类的实例数量、实现单例模式、实现全局共享的配置参数等。

腾讯云提供了多种云计算相关的产品,可以根据具体需求选择适合的产品。以下是一些腾讯云相关产品的介绍链接地址:

注意:上述链接仅供参考,具体产品选择应根据实际需求进行评估和选择。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++的this指针静态成员,友元函数友元

---- 1. this指针 在上篇讲C++,对象,封装,继承(派生),多态的时候,this指针出现在成员函数,并使用->成员提取符操作成员变量。... C++ ,每一个对象都能通过 this 指针来访问自己的地址,this 指针是所有成员函数的隐含参数,实际上成员函数默认第一个参数T* const register this,this指针成员函数的开始执行前构造的...静态成员 变量或者函数前面加上关键字:static,它就变了一个静态变量或者静态函数,当static出现在中被修饰成员,被成为静态成员。...而静态成员无需构造对象情况下,可以使用名访问。...友元函数友元 所谓友元函数,就是,用friend关键字声明一个函数,这个函数的声明,但不作为成员函数,虽然友元函数不属于成员函数,却可以访问成员,不论成员是public,pirvate

1.5K10
  • 【Kotlin】的初始化 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数定义成员属性 | 次构造函数 | 构造函数默认参数 )

    文章目录 一、主构造函数定义临时变量 二、主构造函数定义成员属性 三、次构造函数 四、构造函数默认参数 一、主构造函数定义临时变量 ---- Kotlin , 可以 声明 时 名后...定义 " 主构造函数 " ; 构造函数 , 可以 定义 成员属性 , 并为 成员属性 提供 初始值 ; 构造函数 , 可以定义 临时变量 , 临时变量 一般使用 以下划线开头 的名称...---- 构造函数 定义临时变量 , 格式 : class 名(_临时变量名: 临时变量类型){} 构造函数也可以 定义成员属性 , 格式 : class 名(var 成员属性名:...成员属性类型){} 代码示例 : class Hello( // 主构造函数, 直接在主构造函数定义属性 var name: String, var age: Int ){}...---- Kotlin 只允许 定义时 定义 一个主构造函数 , 在其中可以定义 临时变量 , 也可以定义 属性变量 ; 次构造函数 定义 Kotlin 内部 , 可以定义 多个 次构造函数

    4.8K20

    【C++】和对象():的默认成员函数构造函数、析构函数、拷贝构造函数、运算符重载

    一个,我们不写的情况下编译器会默认生成6个默认成员函数(C++11后还增加了两个默认成员函数,新增的后面再说),重点学习前四个,后两个稍微了解即可。...6.自定义类型不管我们写不写析构函数,他都会自动调用析构函数。 7.如果类没有申请资源时,析构函数可以不写。(如日期Date) 我们还是以栈Stack例,写一个析构函数。...C语言中实参传给形参就是直接拷贝过去,不会调用一个函数C++传值传参要调用拷贝函数。 我们直接调用拷贝构造函数时,因为是引用传参,就不会形成新的拷贝函数。...} operator==这个函数如果放在里面做成员函数成员函数的第一个参数会默认传this指针,那么它的第一个运算对象就会默认传给隐式的this指针函数体就像下面这样写。..._day; } 但是我们不可以外访问私有的成员,这些_year, _month, _day都是私有成员,那咋办? 用友元函数里面加上下面这句话。

    8910

    【C++】C++ 的 this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )

    一、常量成员函数 1、const 修饰成员函数分析 C++ , 普通的非静态成员函数 , 可以使用 const 进行修饰 , 下面的 Student , 定义了 void fun(int... * 右边修饰的是指针本身 ; 代码示例 : class Student { public: // 使用 const 修饰 成员函数 // const 关键字可以 // void...使用 const 关键字 修饰成员函数 , 会将 成员函数 转化为 " 常量成员函数 " ; " 常量成员函数 " 操作限制 : 不能修改成员变量 : 不能修改 任何 成员变量 值 , 静态成员变量...与 非静态普通成员变量 都不能修改 ; 不能调用非常量成员函数 : 只能调用 " 常量成员函数 " , 不能调用 非常量成员函数 , 以保证不会修改 成员变量 ; " 常量成员函数 " 只能访问 常量成员变量...; // 身高 如果 成员函数 被 const 关键字 声明为 常量成员函数 , 则在该函数 不能修改 对象的 任何成员变量 ; class Student { public: void fun

    22020

    【小家java】静态代码块、构造代码块、静态变量、成员变量执行顺序和继承逻辑

    如果超没有不带参数的构造器,并且子类的构造器又没有显式地调用超的其他构造器,则 java 编译器将报告错误 情况四:子类和父有同名同类型的静态常量的时候 public class Main...我觉得脑子里应该浮现出一个这样的知识点: Java赋值顺序: 1、父静态变量赋值 2、自身的静态变量赋值 3、父成员变量赋值和父块赋值 4、父构造函数赋值 5、自身成员变量赋值和自身块赋值...因此上面如果我们这样写static final int b=112它哪怕准备阶段,值就应该是112了 的初始化阶段:需要做的是执行构造器(请注意:这里不是指的构造函数)。...构造器:编译器收集所有静态语句块和变量的赋值语句,按语句源码的顺序合并生成构造器 因此现在执行:st = new StaticTest().此时我们发现,就会进行对象的初始化了(看到没,这个时候...b变量的赋值语句还没有执行哦~~~) 而对象初始化的顺序成员变量 -> 普通代码块 -> 构造函数 因此这一波过后:a=110了。

    1.5K20

    为什么应该尽可能避免静态构造函数初始化静态字段?

    不同的是Foo以内联(inline)赋值的方法进行初始化,而Bar则将初始化操作定义静态构造函数。...如下所示的两段IL代码分别来源于Foo和Bar,我们可以看到虽然Foo没有显式定义静态构造函数,但是编译器会创建一个默认的静态构造函数,针对静态字段的初始化就放在这里。...但是当我们调用一个并不涉及类型静态字段的Invoke方法时,定义Foo静态构造函数会自动执行,但是定义Bar的则不会,由此可以看出一个类型的静态构造函数的执行时机与类型是否具有beforefieldinit...具体规则如下,这一个规则直接定义CLI标准ECMA-335静态构造函数在此标准中被称为类型初始化器(Type Initializer)或者.cctor。...四、关于“All-Zero”结构体 如果我们一个结构体显式定义了一个静态构造函数,当我们调用其构造函数之前,静态构造函数会自动执行。

    18510

    【C++】构造函数初始化列表 ③ ( 构造函数 的 初始化列表 const 成员变量初始化 )

    构造函数初始化列表 总结 : 初始化列表 可以 成员变量 提供初始值 ; 初始化列表 可以 调用 成员变量 类型的 构造函数 进行成员变量初始化操作 ; 初始化列表 可以 使用 构造函数...传入的 参数 ; 初始化时 , 根据定义顺序 , 先调用 成员变量的 构造函数 , 然后调用外部类构造函数 , 析构函数正好相反 ; 实例对象 的 const 成员变量 必须只能在 初始化列表 中进行...初始化 , 所有的构造函数都要进行初始化操作 ; 一、构造函数 的 初始化列表 const 成员变量初始化 1、初始化 const 常量成员 如果 定义了 被 const 修饰 的 成员变量...进行赋值 的 , 因此 这里 必须在 构造函数的 初始化列表 对 const 成员变量 进行赋值 ; 2、错误代码示例 - 没有初始化常量成员 在下面的 B , 定义了常量 const int..., 对 常量成员 进行初始化操作 ; 3、正确代码示例 - 初始化列表初始化常量成员 在下面的 B , 所有的 构造函数 , 都要使用 初始化列表 初始化 常量成员 , 只要遗漏一个构造函数

    22030

    【C++】C++ 的 this 指针用法 ③ ( 全局函数成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

    , 这个增加的参数是 对象本身的指针 ; Student , 定义了如下函数 : // 成员函数 转为 全局函数 , 多了一个参数 Student* pThis 作为第一个参数 void...的 print 成员函数 , 转为 全局函数 , 转换后的代码 : // 将成员函数 void print() // 转为 全局函数 void Student_print(Student* pThis...Student* pThis 列表的开始位置 ; 详细代码 , 参考最后的完整代码示例 ; 2、全局函数转为成员函数 - 通过 this 指针隐藏操作数 全局函数转为成员函数 , 需要隐藏一个参数..., 就是通过 this 指针隐藏左操作数 , 对象本身 就是 左操作数 , 成员函数 , 通过 this 指针访问对象本身的成员 ; 全局函数 , 实现两个 Student 相加 , 接收两个...---- Student 定义了有参构造函数 , 则其默认的无参构造函数 , 就不会生成 ; // 带参构造函数 Student(int age, int height) { this

    22420

    【Groovy】Groovy 方法调用 ( Groovy 构造函数成员赋值 | Groovy 函数的参数传递与键值对参数 | 完整代码示例 )

    文章目录 一、Groovy 构造函数成员赋值 二、Groovy 函数的参数传递与键值对参数 三、完整代码示例 一、Groovy 构造函数成员赋值 ---- Groovy 没有定义构造函数 ,...但是可以使用如下形式的构造函数 , Groovy 设置初始值 ; new 名(成员名1: 成员值1, 成员名2: 成员值2) 顺序随意 : 成员的顺序随意 , 没有强制要求 , 只需要 成员名...student2 : ${student2.name} , ${student2.age}" println "student3 : ${student3.name} , ${student3.age}" 执行结果...: student : Tom , 18 student2 : Jerry , 16 student3 : Jim , null 二、Groovy 函数的参数传递与键值对参数 ---- Groovy...的构造函数 , 可以使用 成员名1: 成员值1, 成员名2: 成员值2 类型的参数 , 这是键值对 map 类型的集合 ; 但是对于普通的函数 , 不能使用上述格式 , 如果出现 变量名1: 变量值

    9.2K20

    【C++】继承 ⑥ ( 继承构造函数和析构函数 | 类型兼容性原则 | 父指针 指向 子类对象 | 使用 子类对象 对象 进行初始化 )

    地方 , 都可以使用 " 公有继承 " 的 派生 ( 子类 ) 对象 替代 , 该 派生 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外的 所有 成员变量 和 成员方法 ; 功能完整性 :..." 私有继承 " 的 派生 , 是 不具有 基 的 完整功能的 , 因为 最终继承 后的派生 , 无法 外部调用 父的 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则..." 应用场景 : 直接使用 : 使用 子类对象 作为 父对象 使用 ; 赋值 : 将 子类对象 赋值给 父对象 ; 初始化 : 使用 子类对象 对象 初始化 ; 指针 : 父指针 指向...子类对象 , 父指针 子类对象 堆内存 的地址 , 也就是 将 子类对象 地址 赋值给 父类型指针 ; 引用 : 父引用 引用 子类对象 , 将 子类对象 赋值给 父类型的引用 ; 二...// 通过父指针调用父函数 p_parent->funParent(); // 将指向子类对象的指针传给接收父指针函数 // 也是可以的 fun_pointer

    28420

    如何把CPP源程序改写成C语言?

    下面对C++的一些特性,以及如何在c里实现或者替代,作一些初步的探讨: 说明: 函数Ixxxx的构造函数的实现。 原成员函数改为前缀结构体名+‘_’的函数。...函数指针U的析构函数的声明; C语言学习资源汇总【最新版】 U+结构体名称为原的析构函数的实现; Fun-_+结构体名为对该结构体成员函数指针进行指向; 以后遇到上述情况将不再说明。...成员函数里,实际上参数列里也隐含有一个指向自身的this指针。 3)对于静态成员则要定义成全局变量或全局函数,因为结构体不能有静态成员。...二.构造函数 实例化的时候会调用的缺省构造函数struct里,要定义一个同名函数指针指向一个具有构造函数功能的初始化函数,与构造函数不同的是,要在初始化函数里加入进行函数指针初始化的语句....成员函数U需要像一般成员函数一样fun_名()函数中指定。 的析构函数是由系统调用的,C则要显式调用。至于何时调用,要准确判断。

    2.2K20

    C++心决之类和对象详解(下篇)(封装进阶篇)

    再谈构造函数 1.1 构造函数体赋值 创建对象时,编译器通过调用构造函数,给对象各个成员变量一个合适的初始值。...成员变量 声明次序 就是其初始化列表的 初始化顺序 ,与其初始化列表的先后次序无关 1.3 explicit关键字 构造函数不仅可以构造与初始化对象, 对于接收单个参数的构造函数,...不可以,非静态成员函数是要隐式的传this指针的,而静态成员函数没有this指针 2. 非静态成员函数可以调用静态成员函数吗?...,但不是成员函数 友元函数不能用const修饰(友元函数并不是成员函数成员函数中有this指针,this指针才需要被const修饰)(非成员函数不允许使用类型限定符) 友元函数可以定义的任何地方声明...比如上述Time和DateTime声明Date其友元,那么可以Date中直接访问Time的私有成员变量,但想在Time访问Date私有的成员变量则不行。

    9010

    【C++】与对象—— 初始化列表 、static 静态成员

    与对象 1 再谈构造函数 1.1 构造函数体赋值 创建对象时,编译器通过调用构造函数,给对象各个成员变量一个合适的初始值,以我们之前实现的Date对象例。...所以一般建议养成使用初始化列表的习惯,这样可以避免某些意想不到的编译错误,特别是遇到包含构造函数初始值的成员时。 初始化顺序: 显然构造函数每个成员只能出现一次。...注意: 每个成员变量初始化列表只能出现一次(初始化只能一次) 包括以下成员,必须在初始化列表进行初始化 : 引用成员变量 const成员变量 自定义类型成员(并且该类没有默认构造函数时)...静态成员变量的类型可以是常量,引用,指针类型等。 并且,静态成员函数也不与任何对象绑定在一起,他们不包含this指针。...总结 静态成员所有对象所共享,不属于某个具体的对象,存放在静态静态成员变量必须在外定义,定义时不添加static关键字,只是声明 静态成员即可用 名 :: 静态成员 或者 对象.静态成员

    34910

    C++知识概要

    静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员的所有对象中共享的成员,而不是某个对象的成员。...后者是把构造、析构函数设为 protected 属性,再用子类来动态创建 建立的对象有两种方式: 静态建立,静态建立一个对象,就是由编译器对象栈空间中分配内存; 动态建立,就是使用 new...这个过程分为两步,第一步执行operator new()函数搜索一块内存并进行分配;第二步调用构造函数构造对象 什么情况会自动生成默认构造函数 带有默认构造函数成员对象 带有默认构造函数的基...带有一个虚函数 带有一个虚基 合成的默认构造函数,只有基子对象和成员对象会被初始化。...this 指针调用成员变量时,堆栈会发生什么变化 当在的非静态成员函数访问的非静态成员时,编译器会自动将对象的地址传给作为隐含参数传递给函数,这个隐含参数就是 this 指针

    1.1K20

    C++进阶之路:再谈构造函数、static成员、友元(与对象_下篇)

    再谈构造函数 构造函数体赋值 创建对象时,编译器通过调用构造函数,给对象各个成员变量一个合适的初始值 class Date { public: Date(int year, int month,...静态成员函数没有隐藏的this**指针**,不能访问任何非静态成员 静态成员也是成员,受public、protected、private 访问限定符的限制 【问题】 静态成员函数可以调用非静态成员函数吗...静态成员函数没有实例化对象的情况下就可以被调用,它没有 this 指针,因此无法访问非静态成员函数或非静态成员变量。只有通过的对象实例才能访问非静态成员函数。...总结 静态成员函数不能调用非静态成员函数。 非静态成员函数可以调用静态成员函数。 这种行为C++的设计中体现了静态和非静态成员之间的区别,确保了和对象的封装性。...比如上述Time和DateTime声明Date其友元,那么可以Date中直接访问Time 的私有成员变量,但想在Time访问Date私有的成员变量则不行。

    6910

    【笔记】C++面向对象高级编程

    , 作用域结束的时候就会被清理, 也称为自动对象 函数定义的静态对象函数作用域结束后依然存在, 直到程序结束 全局域定义的称为全局对象, 也属于一种静态对象, 同样到程序结束才结束 静态成员必须外定义...委托, 利用指针实现, 功能来自内一个指向另一个指针 构造的时候都是从小到大(从父到子类), 析构则相反, 内存分配也是大套小的 设计模式 普通单例: 静态成员内, 只要一写出这个就会构造...Meyers单例: 核心的静态成员放在函数体内, 这样主动调用这个之前都不会进行构造 模板方法: 是继承和虚函数的一种典型应用....因此我们说多态继承的时候是继承了函数的调用权而不是函数本身的空间 虚指针指向虚函数表, 虚函数表按照目标函数的声明顺序对函数地址指针进行排列, 函数指针指向代码段函数代码位置 对象的函数调用分为静态绑定和动态绑定两种..., 静态绑定是指非虚函数和不满足多态条件的虚函数调用, 静态绑定的情况下, 编译后的代码实际上直接调用call跳转到真正函数的地址进行执行 动态函数绑定需要满足三个条件: 通过指针进行调用, 指针是从子类上转型到父

    90930

    C++与对象(下)

    构造函数体赋值 创建对象时,编译器通过调用构造函数,给对象各个成员变量一个合适的初始值。...静态成员所有对象所共享,不属于某个具体的对象,存放在静态区 2. 静态成员变量必须在外定义,定义时不添加static关键字,只是声明 3....静态成员即可用名::静态成员 或者对象.静态成员来访问 4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员 5....答:不可以,非静态成员调用需要this指针,而静态成员函数无this指针 2. 非静态成员函数可以调用静态成员函数吗? 答:可以,指定域与访问限定符就可。...比如上述Time和DateTime声明Date其友元,那么可以Date中直接访问Time 的私有成员变量,但想在Time访问Date私有的成员变量则不行。

    7510

    C++学习————第七天(初始化列表、static,友元,内部类)

    再谈构造函数 1.1 构造函数体赋值 创建对象时,编译器通过调用构造函数,给对象各个成员变量一个合适的初始值。...const ··· 是静态成员,只能在外初始化) * 除abcyi成员既可以初始初始化列表初始化,也可以函数初始化 3....静态成员函数没有隐藏的this指针,不能访问任何非静态成员 5....静态成员函数可以调用非静态成员函数吗?不可以(没this指针不能访问内部成员) 2. 非静态成员函数可以调用静态成员函数吗? 可以 3....2、比如上述Time和DateTime声明Date其友元,那么可以Date中直接访问Time的私有成员变量,但想在Time访问Date私有的成员变量则不行。

    8510

    【C++】特殊的设计 | 类型转换

    创建 为了保证每次获取的都是同一个对象,就定义了一个静态类型的指针 _p 而静态成员变量,需要在外面初始化 ---- 定义静态成员变量时 创建对象 ---- 此时也可添加add增加和print...) 饿汉模式的代码的基础上进行改造 ---- 定义静态成员变量时设置空 ---- 若_p指针空,创建对象,并返回 调用getinstallce函数时才创建对象 ---- 虽然看似没有问题...,但是多线程下还存在线程安全的问题 定义一个静态锁,用于保护getinstallce函数的实例对象 ---- 初始化时,是不需要显示给值的 ---- 每次获取对象都要加锁解锁,但实际上只需要保证第一次即可...,则都是使用 成员静态指针进行new创建对象的,谁先new是控制不住的 而两者都是饿汉,则都是getinstallce函数创建对象, 可以控制单例1先在getinstallce函数创建对象,再让单例...5 因为编译器进行优化,把a的值放入寄存器,而b所修改实际上是寄存器的a值而不是内存的a值,所以a依旧10 dynamic_cast C++独有的 dynamic_cast用于将一个父对象的指针

    18130
    领券