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

静态成员函数和非静态成员函数的区别?

一个静态成员函数不与任何对象相联系,故不能对非静态成员进行默认访问。 它们的根本区别在于静态成员函数没有this指针,而非静态成员函数有一个指向当前对象的指针this。...f(Sc &s) 10 { 11 s.nsfn(10); // 转换为Sc::nsfn(&s , 10) 12 s.sfn(10); // 转换为Sc::sfn(10) 13 } 函数...对nsfn()的调用,编译像注解的那样进行转换,s的地址作为第一个传递的参数。(你并不实际写该调用,由编译来实现。)...在函数内部,Sc::nsfn()对非静态成员的访问将自动把this参数作为指向当前对象的指针。而当Sc::sfn()被调用时,没有任何对象的地址被传递。因此,当访问非静态成员时,无this指针出错。...这就是为什么一个静态成员函数与任何当前对象都无联系的原因。

1.9K90

C++11 利用const_cast和type_traits修改类成员常量的通用模板函数

我们可以把上面的代码写成一个通用的模板函数。。。。以后只要调用模板函数就成了,就可以把代码简化为1行。...下编译通过 不论new_value是个左值还是右值都可以正常调用 modify_const,模板函数modify_const的用法: const size_t c = 21; modify_const...(c,5ULL);//调用模板函数将常量c的值修改为5, //注意size_t 在64位系统下定义为unsigned long long,所以这里的参数5必须有类型限定后缀ULL才能与第一个参数的基本类型保持一致...modify_const只是在C++语法上实现了修改const修饰的常量,其实只对类成员常量以及非基本类型的局部常量有效,对于函数局部基本类型常量修改是无效的。...对于全局常量或类的静态常量成员,因为位于程序的常量存储区,受CPU指令级的内存保护(只读),所以是不能被修改的,虽然修改全局常量或类成员静态常量的代码也能编译通过,但实际运行时会抛出内存访问冲突的异常。

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

    【非原创】C++类成员函数的重载、覆盖和隐藏

    题目: 类成员函数的重载、覆盖和隐藏区别描述正确的有?...、函数名字相同,参数相同,基类无virtual关键字的派生类的函数会"隐藏"父类函数 答案: CD 解析: a.成员函数被重载的特征: (1)相同的范围(在同一个类中); (2)函数名字相同;...b.覆盖是指派生类函数覆盖基类函数,特征是: (1)不同的范围(分别位于派生类与基类); (2)函数名字相同; (3)参数相同; (4)基类函数必须有virtual 关键字。 c....“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下: (1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。...(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。

    68720

    vue3.0js 非prop属性的值和setup函数的使用

    非prop属性的值 一个非 prop 的 attribute 是指传向一个组件,但是该组件并没有相应 prop 定义的 attribute。...> Vue3 中的setup 一种是setup函数,一种是script setup setup函数 setup函数原理说明 由于setup 是在beforeCreate 和 create...setup函数特性 1、setup函数是处于 生命周期函数 beforeCreate 和 Created 两个钩子函数之间的函数 也就说在 setup函数中是无法 使用 data 和 methods...中的数据和方法的 2、setup函数是 Composition API(组合API)的入口 3、在setup函数中定义的变量和方法最后都是需要 return 出去的 不然无法再模板中使用 setup...函数将接收两个参数,props&context Props :props接收父组件传入的值,为Proxy对象,且为响应式,所以不能使用 ES6 解构,它会消除 prop 的响应性 setup 包含的生命周期

    7910

    const 使用总结

    它可以用于任何函数或者类之后的全局或namespace的变量,也可以用于文件、函数、块作用域、类中的static变量,也可以用于修饰成员函数、函数的参数、模板参数。...);// 调用的是第一个函数fun(obj2);// 调用的是第二个函数上面的代码中,根据实参是否是常量对象来调用相应的函数,当使用常量实参调用fun函数时,只能匹配到const版本的那个函数,当使用非常量实参调用...,当使用常量对象时调用的则是常量成员函数版本。...但是又有另外的问题出现,这两个成员函数的函数体基本上是一模一样的,这样不仅造成代码的重复,而且维护起来也麻烦,假如要修改代码,就必须要同时修改两处地方,不然就可能造成不一致的地方。...跟非模板函数不一样的是,模板函数一般不会进行类型转换,而是直接生成另外一个模板实例。但是对于const是个例外,它允许const进行类型转换。

    13210

    【笔记】《深入理解C++11》(上)

    初始化列表的效果总是慢于就地初始化, 但也快过在构造函数中进行赋值 注意: 非常量的静态变量依然要在头文件外定义从而保证在程序中只存在一个 sizeof()可以对类成员表达式使用了 类模板也可以声明友元了...原因和extern变量一样, 普通的模板只存在于对应文件的.o中, 如果一个模板文件被多个文件实例化就会产生多份重复代码, 没有extern的话此时重复的模板会冲突....有了extern后编译器会自动删除重复的实例化模板, 不但节省内存还节省了多余的实例化时间 注意被其他文件调用的外部模板一定要在要用到的类实例化之前实例化 局部和匿名成员可以作为模板实参了, 但仍要注意匿名类型的声明不能在参数位置...3 通用为本, 专用为末 继承构造 为了减少派生类层层透传函数以复用基类代码的情况, 可以在类内用using Base::Func;来获取基类被隐藏的同名成员函数(包括构造函数, 此时被称为继承构造函数...不但可以调用基类的构造函数, 也可以调用当前类的其他构造函数, 这样就能进一步减少重复代码 但要注意委派构造不能和普通的初始化列表共用, 因为目标构造(初始化列表)总是先于委派构造被调用, 这会导致目标构造的参数无效

    2K20

    二、从C语言到C++(二)

    模板和STL:C++的模板和STL(Standard Template Library)提供了类型安全的容器和数据结构,这些容器和数据结构在编译时进行类型检查,从而减少了运行时错误的可能性。...C++通过引入更严格的类型检查和转换函数、减少隐式转换、支持面向对象编程以及提供类型安全的容器和数据结构等方式,增强了其类型系统的“强度”,从而提高了代码的安全性和可维护性。...在C++中,尽量使用模板、智能指针和类型安全的容器来替代 void*,以提高代码的可读性、可维护性和安全性。...常量表达式可以用于数组大小、模板参数等需要常量值的地方。C语言没有直接支持常量表达式的概念。 类的常量成员: 在C++中,你可以使用const来声明类的常量成员。...const函数: 在C++中,你可以使用const来修饰成员函数,表示该函数不会修改调用它的对象的任何成员变量(除了mutable成员)。这有助于保证对象的封装性和不变性。

    7310

    CC++编码规范

    >重复使用的代码用函数替代 2.3类的设计申明 类应是描述一组对象的集合 类成员变量应是私有的(private) 保持对象状态信息的持续性 提高类内聚合度...)”意味着“派生类是基类” 关于“有”和“由…实现” 关于继承和模板(template)的区别 关于继承接口和继承实现 限制继承的层数 继承树上非叶子节点的类应是虚基类... 尽量使用初始化列表 初始化列表要按成员声明顺序初始化它们 构造函数没结束,对象就没有构造出来 不要用构造函数初始化静态成员 拷贝构造函数和赋值函数尽量用常量参数... 尽量避免重载在模板类型上 2.15友元 少用友元 减少拥有友元特权的个数 2.16模板 使用模板如果有限制条件一定要在注释和文档中描述清楚 ...模板类型应传引用/指针而不是值 注意模板编译的特殊性 2.17宏 彻底用常量替代(类似功能的)宏 代码中的数值应由一个有意义的标识符代替 若宏值多于一项

    2K20

    C++编译与链接(0)-.h与.cpp中的定义与声明

    static函数 在不同的cpp中可以定义函数原型一样的函数 类 不同的cpp中类的名字可以一样 类成员与函数 在.h中定义,所有成员必须在类中声明,在cpp中实现 非静态的常量整形数据成员不能就地初始化...(*C++11中,标准允许使用等号=或者花括号{}进行就地的非静态成员变量初始化) 在类内部定义的成员函数将自动作为inline处理 在.h外部定义的函数需要加上inline说明 否则在被include...(*C++11中,标准允许使用等号=或者花括号{}进行就地的非静态成员变量初始化) #pragma once class A { public: const int i=50; }; error...- 不可以 (*C++11中,标准允许使用等号=或者花括号{}进行就地的非静态成员变量初始化) 类成员函数 ------------------ ---------------- 在.h外部定义的函数需要加上...需要到头文件以外去定义它) 类的静态的常量整形数据成员 ------------------ 可以 特殊说明 模板 模板函数与模板类的声明与实现必须放在一个文件中 至于为什么会这样,与C++的编译和链接

    3.7K70

    C++函数模板详解

    : elem_cnt : 5 expecting: 10 min()的宏扩展在这种情况下会失败因为应用在指针实参p 上的后置递增操作随每次扩展而被应用了两次 二 .解决办法: 函数模板提供了一种机制通过它我们可以保留函数定义和函数调用的语义在一个程序位置上封装了一段代码确保在函数调用之前实参只被计算一次...函数定义或声明跟在模板参数表后除了模板参数是类型指示符或常量值外函数模板的定义看起来与非模板函数的定义相同 template Type min( const Type (&r_array)[size]...] < min_val ) min_val = r_array[i]; return min_val; } 在程序的运行过程中Type 会被各种内置类型和用户定义的类型所代替而size 会被各种常量值所取代这些常量值是由实际使用的...min()决定的记住一个函数的两种用法是调用它和取它的地址 当一个名字被声明为模板参数之后它就可以被使用了一直到模板声明或定义结束为止模板类型参数被用作一个类型指示符可以出现在模板定义的余下部分它的使用方式与内置或用户定义的类型完全一样比如用来声明变量和强制类型转换模扳非类型参数被用作一个常量值可以出现在模板定义的余下部分它可以用在要求常量的地方或许是在数组声明中指定数组的大小或作为枚举常量的初始值...min( T2, T3 ); ④ 模板参数名在同一模板参数表中只能被使用一次,但是模板参数名可以在多个函数模板声明或定义之间被重复使用 // 错误: 模板参数名 Type 的非法重复使用 template

    1K70

    C++基础知识精髓

    常量折叠,又叫常量替换,c++编译器会在编译时,将const常量的字面值保存在符号表中,在编译时使用这个字面常量进行替换。...内联函数:在编译阶段函数代码替换函数名,在调用运行的时候就没有函数的压栈和出栈的操作,提高运行效率,是空间换时间。...模板 C++中的一个概念:泛型编程:所谓泛型编程就是独立于任何特定类型的方式编写代码。模板是泛型编程的基础。...模板函数: 函数模板是生成函数代码的样板,当参数类型确定后,编译时用函数模板生成一个具有确定类型的函数,这个由函数模板而生成的函数称为模板函数。...inline函数模板: 函数模板可以用与非模板函数一样的方式声明为inline。说明符放在模板形参表之后、返回类型之前,不能放在关键字template之前。

    2K50

    整理了70道C语言与C++常见问答题

    而 C++中除了上述功能外,还用来定义类的成员变量和函数。即静态成员和静态成员函数。...C++代码调用C语言代码 在C++的头文件中使用 在多个人协同开发时,可能有的人比较擅长C语言,而有的人擅长C++,这样的情况下也会有用到 31 请你来说一下C++中struct和class的区别 在C...继承性:广义的继承有三种实现形式:实现继承(使用基类的属性和方法而无需额外编码的能力)、可 视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)。...「注意」:当有类中有指针类型的成员变量时,一定要重写拷贝构造函数和赋值运算符,不要使用默认 的。 41 在C++中,使用malloc申请的内存能否通过delete释放?...定义」对单一模板提供的一个特殊实例,它将一个或多个模板参数绑定到特定的类型或值上 (1)模板函数特例化 必须为原函数模板的每个模板参数都提供实参,且使用关键字template后跟一个空尖括号对,表明将原模板的所有模板参数提供实参

    3.1K01

    第 16 章 模板与泛型编程

    模板中使用到的类型相关的函数或运算符应尽可能的少。 为了生成一个实例化版本,编译器需要掌握函数模板或类模板成员函数的定义。...因此,与非模板代码不同,模板不能分离式编译,其头文件中通常既包括声明也包括定义。 模板直到实例化时才会生成代码,大多数编译错误在实例化期间报告。通常,编译器会在三个阶段报告错误。...普通(非模板)类的成员模板。...成员模板是函数模板,在类模板外定义一个成员模板时,必须同时为类模板和成员模板提供模板参数列表。...(const string &s) { cout << '"' + s + '"'; } // 对于下面的代码调用,会使用普通非模板函数 cout << debug_rep(s) << endl;

    1.5K20

    第 16 章 模板与泛型编程

    模板中使用到的类型相关的函数或运算符应尽可能的少。 为了生成一个实例化版本,编译器需要掌握函数模板或类模板成员函数的定义。...因此,与非模板代码不同,模板不能分离式编译,其头文件中通常既包括声明也包括定义。 模板直到实例化时才会生成代码,大多数编译错误在实例化期间报告。通常,编译器会在三个阶段报告错误。...普通(非模板)类的成员模板。...成员模板是函数模板,在类模板外定义一个成员模板时,必须同时为类模板和成员模板提供模板参数列表。...(const string &s) { cout << '"' + s + '"'; } // 对于下面的代码调用,会使用普通非模板函数 cout << debug_rep(s) << endl;

    1.4K60

    C++17中的std::as_const详解

    泛型编程追求代码的复用性和通用性,在泛型函数或模板类中,对象的类型和可变性可能是不确定的。使用std::as_const可以避免不必要的类型转换和复制,保证代码的效率和安全性。...尝试修改常量引用:当我们尝试通过constView调用clear()方法时,会导致编译错误,因为constView是一个常量引用,不允许调用非const成员函数。...例如,在一个模板函数中,我们希望对传入的对象进行只读操作,就可以使用std::as_const来创建一个常量引用。...七、总结通过std::as_const,C++17为我们提供了一种更安全、更简洁的方式来处理常量对象的引用。它避免了不必要的类型转换和复制,同时保持了代码的可读性和灵活性。...在实际编程中,合理使用std::as_const可以提高代码的安全性和性能,尤其是在泛型编程和处理只读操作的场景中,它的优势更加明显。

    6700

    C++复习笔记——C++ 关键字

    C++ 中的 bool类型可以和int混用,具体来说就是0代表false,非0 代表 true。bool类型常用于条件判断和函数返回值。...export 为了访问其他编译单元(如另一代码文件)中的变量或对象,对普通类型(包括基本数据类、结构和类),可以利用关键字 extern,来使用这些变量或对象时;但是对模板类型,则必须在定义这些模板类对象和模板函数时...const const(常量的,constant)所修饰的对象或变量不能被改变,修饰函数时,该函数不能改变在该函数外面声明的变量也不能调用任何非const函数。...mutable mutable(易变的)是 C++ 中一个不常用的关键字。只能用于类的非静态和非常量数据成员。...如果一个类的成员函数被声明为 const类型,表示该函数不会改变对象的状态,也就是该函数不会修改类的非静态数据成员。

    1.3K30

    C++11如何使用大括号{}进行初始化

    void Fun(initializer_list iv){} 上述代码中,为People类定义了一个使用initializer_list>模板类作为参数的构造函数...为参数的函数,也可以使用初始化列表: Fun({ 1, 2 }); Fun({});//空列表 同理,类和结构体的成员函数也可以使用初始化列表,包括一些操作符的重载函数。...在C++98中要求较高:如果静态成员不满足常量性,不能就地声明,且而且即使常量的静态成员也只能是整型或枚举型才能就地初始化。...在C++11中,除了初始化列表(在构造函数中初始化)外,允许使用等=或花括号{}进行就地的非静态成员变量初始化,例如: struct example { int a = 1; double...b{ 1.2 }; }; 注意:如果在一个类中,既使用了就地初始化来初始化非静态成员变量,又在构造函数中使用了初始化列表,执行顺序是:先执行就地初始化,然后执行初始化列表。

    14610

    【Java 类】002-类、属性、方法、代码块

    继承:类可以通过继承现有类的属性和方法来扩展自己的功能。继承可以减少代码的重复,提高代码的可复用性和可维护性。 多态:类可以通过多态来实现同一种行为具有不同的表现形式。...多态可以提高代码的灵活性和扩展性。 对象的创建和销毁:类是创建对象的模板,通过类可以创建多个对象。同时,类也可以定义对象的销毁方式,通过垃圾回收机制自动回收不再使用的对象。...四、代码块 1、概述 Java 类中的代码块是指在类中使用大括号 {} 括起来的一段代码,它们可以是静态的或非静态的,并且可以分为多个不同类型。...使用代码块的好处是可以将多个方法中共同的部分提取出来,统一进行处理,从而提高代码的重用性和可维护性。...比如在静态代码块中可以对静态成员变量进行初始化,或者对数据库连接进行初始化;在实例初始化块中可以对非静态成员变量进行初始化,或者执行一些必要的预处理操作;在构造代码块中可以对所有构造函数中共同的初始化操作进行封装

    8510

    《C++11》静态断言(Static Assert)的使用与优势

    常量表达式检查:可以确保某些表达式在编译时是常量表达式,这对于模板编程和编译时计算非常重要。约束模板参数:在模板编程中,可以用来约束模板参数,确保它们满足特定的条件,使得模板更加灵活和安全。...减少运行时开销:通过在编译时期解决问题,静态断言可以减少运行时的检查和异常处理的需要,从而提高程序的执行效率。静态断言的使用场景静态断言主要用于在编译时检查一些必须满足的条件。...延迟计算:如果静态断言的常量表达式依赖于某些模板参数,则延迟到模板实例化时再进行演算。适用范围:静态断言可以用在全局作用域中,命名空间中,类作用域中,函数作用域中,几乎可以不受限制地使用。...这样可以避免在每个函数中都写相同的类型检查代码,提高了代码的复用性。...通过使用静态断言,我们可以在编译时期就检查代码逻辑,发现和修复潜在的错误,提高代码的可读性和可维护性,增强类型安全性,约束模板参数,减少运行时开销。

    8000

    读完某C++神作,我只记下了100句话

    static成员函数没有this形参,可直接访问类的static成员,不能使用非static成员。 静态数据成员属于一个类,而不属于类的各个对象。静态成员函数在所有对象建立之前或删除之后仍然使用。...构造函数如果是explicit必须严格按照定义使用构造函数,否则可以存在隐式转换。 非引用形参将复制实参值,非引用return将复制return的东西。...通过在成员前面加上typename告诉编译器将成员当做类型。泛型代码两个原则:1.模板形参是const引用 2.函数体中只用<比较 模板形参数量自由,可以设定返回值为一个形参。...非类型形参的模板实参:template 实例化时必须是常量表达式 Screen 模板中的友元表示任何实例可以访问任何实例。模板类中可以有模板类成员。...匹配同样好时,非模板版本优先。

    1.4K20
    领券