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

C++静态数据成员和静态成员函数

我们需要一个成员为所有对象所公有,而且在需要更新这个公有属性时候只需修改一次。 因此,C++提供了静态数据成员来描述对象相同属性。...静态成员函数 一般都是在静态成员函数中修改静态数据成员,在刚刚手机声明中成员函数: static void change(); 就是静态成员函数。...但是非静态成员函数可以任意地访问静态成员函数静态数据成员。 那静态成员函数存在意义是什么?...首先,可能你在做题时候,题目要求你使用静态成员函数完成任务…… 开个玩笑啦…… 静态成员函数没有this指针,因为它在创建时候就存在了,在没有创建对象时候就已经存在静态成员函数,而普通函数必须在对象被创建时候才能被使用...简而言之,静态成员函数是服务于,而不是某个对象,它方便在于不需要定义对象就能使用。

14730
您找到你想要的搜索结果了吗?
是的
没有找到

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

---- 1. this指针 在上篇讲C++,对象,封装,继承(派生),多态时候,this指针出现在成员函数中,并使用->成员提取符操作成员变量。...在 C++ 中,每一个对象都能通过 this 指针来访问自己地址,this 指针是所有成员函数隐含参数,实际上成员函数默认第一个参数为T* const register this,this指针在成员函数开始执行前构造...,它可以用来指向调用对象,并且只可以在成员函数调用,对于全局函数静态函数,友元函数,都不能使用this指针。...也就是说在函数体内,静态变量具有“记忆”功能,即一个被声明为静态变量在这一函数调用过程中其值维持不变,每个对象有各自成员变量,但是他们共享静态变量。所以静态变量相当于是大家共有资源。...所以this指针不能在静态函数中使用,静态函数如同静态变量一样,他不属于具体哪一个对象,静态函数表示了整个范围意义上信息,而this指针却实实在在对应一个对象,所以this指针不能被静态函数使用

1.4K10

2021-04-14 quickjs调用静态成员函数

有这样一个需求:多线程条件下执行交易,每个交易都会通过quickjs回调c++代码函数,而这个函数使用数据又来自于当前交易 首先不考虑用全局变量来保存交易数据,因为js回调c函数时候我们无法在回调函数中区分当前属于哪个交易...,如果你总是把交易id通过回调函数传递过来也是可以实现,只是这样函数就多了个参数,写js代码的人无法理解。...一个简单思路是c代码创建交易,然后把函数传递给quickjs,然后在js中调用这个函数,但是这个实现不了,因为quickjs没有注入非静态成员函数接口,其原因文章非static成员函数通过名...::来调用指针调用成员方法不出错!...讲解比较清楚 换个思路,我们先用js创建这个,然后调用eval把数据传递给它,这样调用这个静态成员函数时候就可以正确访问到数据了,我们直接修改文件example.cpp 具体实现如下

92320

C++如何禁止函数传值调用

代码编译运行环境:VS2017+Debug+Win32 ---- 按照参数形式不同,C++应该有三种函数调用方式:传值调用、引用调用和指针调用。...对于基本数据类型变量作为实参进行参数传递时,采用传值调用与引用调用和指针调用效率相差不大。但是,对于类型来说,传值调用和引用调用之间区别很大,对象尺寸越大,这种差别越大。...因此,不显示定义拷贝构造函数,并不能阻止对拷贝构造函数调用,原因是编译器会自动为没有显示定义拷贝构造函数提供一个默认拷贝构造函数。...这样就能阻止了函数调用时,A对象以值传递方式进行函数函数调用。...---- 参考文献 [1]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008.[3.5(P102-P103)] [2]拷贝构造函数什么时候调用

2.4K30

C++ 语言】面向对象 ( 继承 | 重写 | 子类调用方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )

C++ 多继承 : Java 中只能进行单继承 , 但是在 C++ 中是可以继承多个父 ; 在多继承时 , 使用 “,” 将多个父分隔即可 ; 5....静态多态 : 在编译时 , 就可以确定函数调用地址 ; 上面 多态 中示例就是静态多态示例 ; 下面的虚函数示例 , 是动态多态示例 ; 2 ....Parent* parent = new Child(); //静态多态 : 在编译时 , 就可以确定函数调用地址 ; // 此时调用其 parent_method 方法 , 调用是父方法...结果分析 : ① 静态多态分析 : 第一次调用 parent_method 方法 , 虽然子重写该方法 , 但是对象类型声明是父类型 , 其仍然调用方法 ; ② 动态多态分析 : 第二次调用...= new Child(); //静态多态 : 在编译时 , 就可以确定函数调用地址 ; // 此时调用其 parent_method 方法 , 调用是父方法 parent->parent_method

85220

C++】继承 ⑧ ( 继承 + 组合 模式对象 构造函数 和 析构函数 调用规则 )

一、继承 + 组合 模式对象 构造函数和析构函数调用规则 1、场景说明 如果一个 既 继承了 基 , 又 在中 维护了一个 其它类型 成员变量 , 那么 该类 构造 与 析构 , 就需要涉及到... 本身 构造函数 和 析构函数 , 父 构造函数 和 析构函数 , 成员变量 构造函数 和 析构函数 ; 2、调用规则 在 继承 + 组合 情况下 , 构造函数 与 析构函数 调用规则如下...: 构造函数 : 父 -> 成员 -> 自身 ; 首先 , 调用 构造函数 ; 然后 , 调用 成员 构造函数 ; 也就是 成员变量 类型 构造函数 ; 最后 , 调用 自己 构造函数 ;...自身定义 构造函数 ; 析构函数 : 自身 -> 成员 -> 父 ; 首先 , 调用 自己 析构函数 ; 自身定义 析构函数 ; 然后 , 调用 成员 析构函数 ; 也就是 成员变量 类型...; A 和 B 构造函数 , 是 父构造函数 ; D 构造函数 , 是 成员构造函数 ; C 构造函数 , 是 自身构造函数 ; 构造函数调用顺序为 : 父 -> 成员 -> 自身 , 符合上述调用原则

15410

googl中java、c++编程风格

优点:某些情冴下,非成员函数静态成员函数是非常有用,将非成员函数置亍命名间中可避免对全 尿作用域污染。...结论 有时,丌把函数限定在实体中是有益,甚至需要返么做,要么作为静态成员,要么作为非成员函数。 非成员函数丌应依赖亍外部发量,幵尽量置亍某个命名间中。...相比单纯为了封装若干丌共享仸何静态数 据静态成员函数而创建,丌如使用命名空间。 定义亍同一编译单元函数,被其他编译单元直接调用可能会引入丌必要耦吅和还接依赖;静态成员函 数对此尤其敏感。...大多数全局变量应该是静态数据成员,或者当其叧在.cc 文件中使用时,将其定义到不具名命名间中,戒者使用静态关联以限制发量作用域。   ...缺点:限制使用重载一个原因是在特定调用处徆难确定到底调用是哪个函数另一个原因是当派生 叧重轲函数部分发量会令徆多人对继承诧义产生困惑。

1K20

4.C++中函数重载,C++调用C代码,newdelete关键字,namespace(命名空间)

本章主要内容: 1)函数重载 2)C++调用C代码 3)new/delete关键字实现动态内存分配 4)namespace命名空间 ---- 大家都知道,在生活中,动词和不同名词搭配一起,意义都会大有不同...注意: 重载函数需要避免使用参数默认值 调用重载函数时,只会匹配函数参数表,与函数返回值无关 函数重载必须发生在同一个作用域中 重载函数入口地址,不能直接通过函数名来获取 2.C++与C代码相互调用...当C++调用C里某个函数时,则使用extern “C” 还是举个栗子,通过C++调用C里面的add()函数 1) 首先创建3个文件 ?...(namespace)概念 命名空间会将全局作用域分成不同部分命令空间,可以将,对象,函数等聚集在一个namespace里 不同命名间中标识符可以同名 命名空间可以相互嵌套,也就是说A命令空间里可以再次定义...int varialbe; //... ... } 2)使用整个命名空间name,并将该空间设为当前默认命名空间: using namespace name; 3)使用全局命名间中变量

82020

一文掌握C++基本语法

C++关键字 2. 命名空间 变量、函数和后面要学到都是大量存在,这些变量、函数名称将都存在于全局作用域中,可能会导致很多冲突。...PS:命名空间定义了一个新作用域,命名间中所有内容都局限于该命名间中,但是成员生命周期没有改变,仍然是全局。...5.3 extern “C” 我们知道C语言可以调用C语言静态库和动态库,C++可以调用C++静态库和动态库,那么C++能不能调用C库?C能不能调用C++库? 答案是可以。...我们先来看C++调用C库,这里我们用C语言实现代码生成一个静态库 再新开一个项目,调用这个库,这里对新项目的属性进行更改。...在学习C语言时候,我们遇到函数体短小且频繁调用函数时候,采用优化方式是使用宏进行替换,但是宏太繁琐啦,难以看懂,因此c++就产生了内联函数。 那么内联函数如何进行优化呢?来看代码。

61410

C++C++ 入门

命名空间:在C/C++中,变量、函数和后面要学到都是大量存在,这些变量、函数名称将都存 在于全局作用域中,可能会导致很多冲突。...命名空间有如下特点: 命名空间名称是随意取命名间中可以定义函数/变量/类型; 命名空间可以嵌套; 同一个工程中允许存在多个相同名称命名空间,编译器最后会将其合成到同一个命名间中命名间中定义函数...,这个域叫做命名空间域,命名间中所有内容都局限于该命名间中; 2、命名间中定义变量都是全局变量:如下图,命名空间N中成员变量a可以在函数test被访问,说明a作用域是全局,所以a是全局变量...---- 三、C++输入输出 C++输入输出语句如下: #include // std是C++标准库命名空间名,C++将标准库定义实现都放到这个命名间中 using namespace...std命名空间使用惯例:std是C++标准库命名空间,如何展开std使用更合理呢? 1、 在日常练习中,建议直接using namespace std即可,因为这样很方便。

2.4K00

《C++Primer》第十八章 用于大型程序工具

这里重新抛出仍然是一条throw语句,只不过不包含任何表达式: // throw语句只能在catch语句或catch语句或catch语句直接直接或间接调用函数之外 // 如果在处理代码之外区域遇到了...未命名命名间中定义变量具有静态生命周期:它们在第一次使用前被创建,直到程序结束时才销毁。 每个文件定义自己命名命名空间,如果两个文件都含有未命名命名空间,则这两个空间互相无关。...未命名命名空间取代文件中静态声明: 在标准C++引入命名空间概念之前,程序需要将名字声明成static以使其对于整个文件有效。在文件中进行静态声明做法是从C语言继承而来。...在C语言中,声明为static全局实体在其所在文件外不可见。 在文件中进行静态声明做法已经被C++标准取消了,现在做法是使用未命名命名空间。 2....合成析构函数体为

1.3K20

Google C++ 编程风格指南(二):作用域

定义: 在一个内部定义另一个; 嵌套也被称为 成员 (member class). class Foo { private: // Bar是嵌套在Foo中成员 class...定义在同一编译单元函数, 被其他编译单元直接调用可能会引入不必要耦合和链接时依赖; 静态成员函数对此尤其敏感. 可以考虑提取到新中, 或者将函数置于独立库名字空间内....静态和全局变量 禁止使用 class 类型静态或全局变量:它们会导致难以发现 bug 和不确定构造和析构函数调用顺序。不过 constexpr 变量除外,毕竟它们又不涉及动态初始化或析构。...静态变量构造函数、析构函数和初始化顺序在 C++ 中是不确定,甚至随着构建变化而变化,导致难以发现 bug....同理,全局和静态变量在程序中断时会被析构,无论所谓中断是从 main() 返回还是对 exit() 调用。析构顺序正好与构造函数调用顺序相反。但既然构造顺序未定义,那么析构顺序当然也就不定了。

73030

C++ 作用域使用规范建议

名字空间是ANSI C++引入可以由用户命名作用域,用来处理程序中常见同名冲突。...(3)尽量不要使用全局函数 应该使用命名间中非成员函数静态成员函数。这样做原因是在某些情况下,非成员函数静态成员函数是非常有用,将非成员函数置于命名间中可避免对全尿作用域污染。...有时,不把函数限定在实体中是有益,甚至需要这么做,要么作为静态成员,要么作为非成员函数。非成员函数不应依赖于外部变量,并尽量置于某个名字空间中。...相比单纯为了封装若干不共享任何静态数据静态成员函数而创建,不如使用名字空间。 定义于同一编译单元函数,被其他编译单元直接调用可能会引入不必要连接依赖,静态成员函数对此尤其敏感。...大多数全局变量应该是静态数据成员,或者当其只在.cpp文件中使用时,将其定义到不具名名字空间中,或者使用静态关联以限制变量作用域。

1K20

C++】STL 算法 ① ( STL 算法相关头文件 | 函数对象 仿函数 简介 | 函数调用操作符 | 重写函数调用操作符 | 函数对象 与 普通函数区别 )

/ 仿函数 博客回顾 在之前博客 【C++】STL 容器 - set 集合容器 ⑤ ( 仿函数 functor 简介 | 仿函数 functor 调用 | 自定义排序规则 - 仿函数 / 重载 <...运算符函数 ) 中 简单介绍了 " 仿函数 " 概念 ; 在结构体中 operator() 就是 重载 函数调用操作符 () 函数 ; 在 C++ 语言中 struct 结构体 与 class 是等同...{ return (a < b); // 降序排序 } }; 创建 仿函数 函数对象 , 然后通过 函数对象 调用 仿函数 " 重载 函数调用操作符 () 函数 " ; //..., 通常是一对圆括号 () ; 在 C++ 语言中 , 函数调用操作符都扮演着重要角色 ; " 函数调用操作符 " 主要作用是 将 函数 与其 参数 联系起来 , 并执行函数代码 ; 函数调用操作...、函数对象 / 仿函数 - 重写函数调用操作符 " 函数对象 " 是 重载 函数调用操作符 " () " , 又称为 " 仿函数 " , 它们是 行为类似函数 对象 ; " 函数对象 "

13610

Google C++编程风格指南(三)之作用域相关规范

(3)尽量不要使用全局函数 应该使用命名间中非成员函数静态成员函数。...这样做原因是在某些情况下,非成员函数静态成员函数是非常有用,将非成员函数置于命名间中可避免对全尿作用域污染。...有时,不把函数限定在实体中是有益,甚至需要这么做,要么作为静态成员,要么作为非成员函数。非成员函数不应依赖于外部发量,并尽量置亍某个命名间中。...相比单纯为了封装若干不共享任何静态数据静态成员函数而创建,不如使用名字空间。 定义于同一编译单元函数,被其他编译单元直接调用可能会引入不必要合和连接依赖;静态成员函数对此尤其敏感。...可以考虑提取到新中,或者将函数置亍独立库命名间中

1.2K30

【笔记】《C++Primer》—— 第18章:用于大型程序工具

18.1 异常处理 在之前5.6时候简单提到过异常处理,当时只大概介绍了如何使用C++异常处理部分,这一节更深入地介绍了异常处理时细节 异常处理流程是:在C++中我们throw了一个表达式后会...catch捕获异常忽略掉 catch只允许最基础转换,包括常量改变,派生向基,数组转指针,函数转指针四种,其他类型转换都不支持 有时候我们发现单个catch无法完全处理好异常时,我们用一个throw...,将旧版本代码放在命名间中,新版本则内联,这样容易切换所需版本 如果namespace后面不加名字直接定义命名空间的话,此时称为未命名命名空间,在这里面定义变量有静态生命周期,在第一次使用时创建...未命名命名间中名字作用域其所在空间相同,如果定义在全局区域则相当于全局作用域,定义在别的空间中则相当于其他命名空间 除了直接特指命名间中名称来进行调用外,我们也可以用using XXX...,如果我们直接调用函数传递派生对象进去,会产生二义性错误,需要用特质来解决 和单继承时一样,静态类型决定了我们能调用那些成员 在多继承时候,名称查找会在所有直接基中同时进行,单个继承链上才有顺序,

93220
领券