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

一个面试题引发的思考——类的特种成员函数

之前问面试者“定义一个空类,并声明该类的多个对象,为什么对象间可以相互赋值?”本意是希望面试者能够回答编译期默认生成的构造函数、拷贝构造函数和拷贝赋值运算符函数。但是并没有回答到点子上。...进一步引导到,“类的特种成员函数有哪些?”,也没有回答上来。有可能是我没有问清楚,也有可能是面试者由于紧张懵住了。今天刚好拿出这个问题来讨论下。...类的特种成员函数 关于特种成员函数,C++11前有四个:默认构造函数、析构函数、拷贝构造函数、拷贝赋值运算符。C++11开始新增了移动赋值运算符和移动构造函数,即C++11起存在6个特种成员函数。...这些成员函数只有在代码中用到且没有声明时才会生成默认,即没有用到则不会生成。(见示例代码1) 关于默认构造函数:当类中不存在构造函数时,才会生成默认构造函数。...(见示例代码1) 移动构造和移动赋值会针对其非静态的成员(含基类部分)执行移动构造和移动赋值,但是移动构造和移动赋值只是移动请求;针对不可移型别将执行对应的拷贝动作。

7510

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

一、全局函数 与 成员函数 相互转化 1、成员函数转为全局函数 - 多了一个参数 C++ 编译器 , 在编译阶段会将 C++ 类的 成员函数 转为 全局函数 , 转换时 , 会 增加一个参数到参数列表开始为止..., 这个增加的参数是 对象本身的指针 ; 在 Student 类中 , 定义了如下函数 : // 成员函数 转为 全局函数 , 多了一个参数 Student* pThis 作为第一个参数 void...Student* pThis 在 列表的开始位置 ; 详细代码 , 参考最后的完整代码示例 ; 2、全局函数转为成员函数 - 通过 this 指针隐藏操作数 全局函数转为成员函数 , 需要隐藏一个参数..., 就是通过 this 指针隐藏左操作数 , 对象本身 就是 左操作数 , 在成员函数中 , 通过 this 指针访问对象本身的成员 ; 在全局函数中 , 实现两个 Student 类相加 , 接收两个...返回的是一个匿名对象 , 该匿名对象 是在 成员函数 中新创建的对象 ; // 成员函数中, 将两个 Student 对象相加 // 全局函数 转为 成员函数 , 少了一个参数 // 返回一个新

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

    《C++Primer》第十六章 模板与泛型编程

    : 模板中的函数参数是const的引用 函数体中的条件判断仅使用<比较运算 通过将函数参数设定为const引用,我们保证函数可以用于不能拷贝的类型。...类型转换与模板类型参数 能在调用中应用于函数模板的包括如下三项: 顶层const无论是在形参中还是在实参中都会被忽略 const转换:可以将一个非const对象的引用(或指针)传递给一个const的引用...从右值引用函数参数推断类型 当一个函数参数是一个右值引用(即形如T&&),正常绑定规则告诉我们可以传递给它一个右值: template void f3(T&&); f3(42...显然)可以传递给它右值,也可以传递给它左值。...compare一个字符串字面常量或者一个数组时,编译器才会调用第二个版本,如果我们传递给它字符指针,就会调用第一个版本(我们无法将一个指针转换为一个数组的引用): const char *p1 = "hi

    1.9K10

    C++小结(1)

    1. overload 仅仅返回值类型不同的函数不能被重载. 2. 所谓私有,是指该成员只能被类本身的方法访问----即使是这个类的对象也不能直接访问. 3....表现在以下方面: (1)const成员函数:const位于形参括号之后,分号之前.该函数不能修改成员变量. (2)const类:对一个类说明使用了const,实际上是说明了一个const型的this指针...指针用于: A:处理自由存储区中的数据; B:访问类的成员数据和成员函数; C:通过引用传递的方式给函数传递对象或变量. 7. 关键字new分配堆中的内存。...*对一个被delete的指针再次使用delete可能导致程序崩溃.解决办法是delete一个指针后.立即给它赋值0,而对一个空指针使用delete是安全的....对一个指向对象的指针使用new运算符分配空间时,会调用对象类的构造函数.与此类似,使用delete删除一个对象指针时,会调用一个析构函数. 9. 类的成员变量如果是指针变量。

    60490

    Java基础(七):面向对象编程-类和对象

    面向过程的程序设计思想(Process-Oriented Programming),简称POP 关注的焦点是过程:过程就是操作数据的步骤 如果某个过程的实现代码重复出现,那么就可以把这个过程抽取为一个函数...、行为特征抽象出来,用类来表示 典型的语言:Java、C#、C++、Python、Ruby和PHP等 代码结构:以类为组织单位。...其中的形参比较特殊,靠实参给它初始化 对象属性的默认初始化赋值 当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值 三、方法(method) 1、方法的概述 方法是类或对象行为特征的抽象...在某些语言中也称为函数或过程 将功能封装为方法的目的是,可以实现代码重用,减少冗余,简化代码 声明方法的语法格式 [修饰符] 返回值类型 方法名([形参列表])[throws 异常列表]{...形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参 形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参 四、构造器(Constructor) 我们new完对象时,所有成员变量都是默认值

    9010

    this指针的介绍和用法

    记录时间:2019-3-4 this指针的介绍 this指针是面向对象程序设计的一项概念,在C++中,它表示当前运行的对象。在实现对象的方法时,this指针来获得该对象自身的引用。...this作用域是在类内部,而且是在类的非静态成员函数中使用,实际引用并操作对象a的成员。 当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。...在类a的非const成员函数里,this类型就是*a。但是this不是一个常规变量,所以不可以获取this的地址或者给它赋值。...由此可见,this在成员函数的开始前构造的,在成员的结束后清除。 这个生命周期同任一个函数的参数是一样的,没有任何区别。 当调用一个类的成员函数时,编译器将类的指针作为函数的this参数传递进去。...this是通过函数参数的首参数来传递的。this指针是在调用之前生成的。类实例后的函数,没有这个说法。类在实例化时,只分配类中的变量空间,并没有为函数分配空间。

    54120

    Java This和Super的用法

    如上面这段代码中,有一个成员变量name,同时在方法中有一个形式参数,名字也是name,然后在方法中将形式数name的值传递给成员变量name,虽然我们可以看明白这个代码的含义,但是作为Java编译器它是怎么判断的呢到底是将形式参数...为此在上面这个代码中,this.name代表的就是对象中的成员变量,又叫做对象的属性,而后面的name则是方法的形式参数,代码this.name=name就是将形式参数的值传递给成员变量。...(见下面Super 引用构造函数) Super super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。...(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名) 调用super()必须写在子类构造方法的第一行,否则编译不通过。...this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过

    87540

    【Java】final关键字&权限修饰符&内部类&引用类型用法

    局部变量 —— 引用类型 引用类型的局部变量,被 fifinal 修饰后,只能指向一个对象,地址不能再更改。但是不影响对象内 部的成员变量值的 修改,代码如下: 3....内部类 3.1 概述 什么是内部类 将一个类 A 定义在另一个类 B 里面,里面的那个类 A 就称为 内部类 , B 则称为 外部类 。...格式 使用方式 以接口为例,匿名内部类的使用,代码如下: 定义接口: 创建匿名内部类,并调用: 通常在方法的形式参数是接口或者抽象类时,也可以将匿名内部类作为参数传递。...定义武器类,将增加攻击能力: 定义穿戴盔甲类,将增加防御能力,也就是提升生命值: 定义角色类: 测试类: 类作为成员变量时,对它进行赋值的操作,实际上,是赋给它该类的一个对象。...接口作为成员变量时,对它进行赋值的操作,实际上,是赋给它该接口的一个子类对象。 4.3 interface作为方法参数和返回值类型 当接口作为方法的参数时 , 需要传递什么呢?

    45350

    【C++】C++11(lambda、可变参数模板、包装器、线程库)

    [var]:表示值传递方式捕捉变量var [=]:表示值传递方式捕获所有父作用域中的变量(包括this) [&var]:表示引用传递捕捉变量var [&]:表示引用传递捕捉所有父作用域中的变量(包括this...) [this]:表示值传递方式捕捉当前的this指针 注意: 父作用域指包含lambda函数的语句块 语法上捕捉列表可由多个捕捉项组成,并以逗号分割。...,它是将现有的东西传给它,然后存起来,再通过operator()把参数传给可调用对象去调用。...如果想要通过形参改变外部实参时,必须借助std::ref()函数,强行把中间的拷贝变成引用拷贝。 注意:如果是类成员函数作为线程参数时,必须将this作为线程函数参数。...,标准库已经将atmoic模板类中的拷贝构造、移动构造、赋值运算符重载默认删除掉了。

    12610

    c++面试题

    C++的多态性具体体现在运行和编译两个方面:在程序运行时的多态性通过继承和虚函数来体现; 在程序编译时多态性体现在函数和运算符的重载上 虚函数:在基类中冠以关键字 virtual 的成员函数。...10.将“引用”作为函数参数有哪些特点? (1)传递引用给函数与传递指针的效果是一样的。...“引用”与指针的区别是什么? 指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。...多态:是将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。...当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。

    1.2K21

    【C++】C++11新特性——可变参数模版、lambda、包装器

    ,如果自定义类型中的成员变量很多而且都要通过比较来排序,那就要实现很多个类。...(包括this) 其中: 父作用域指包含lambda函数的语句块 语法上捕捉列表可由多个捕捉项组成,并以逗号分割 [=, &a, &b]:以引用传递的方式捕捉变量a和b,值传递方式捕捉其他所有变量...函数对象将rate作为其成员变量,在定义对象时给出初始值即可;lambda表达式通过捕获列表可以直接将该变量捕获到,捕获的本质是构造函数初始化参数。...在这个点上特别需要注意的是类的成员函数。...function f2 = &Func::func2;//非静态成员函数 return 0; } 成员函数受类域限制,需要指定类域 非静态成员函数取函数指针时要

    19810

    构造器、static、this 关键字讲解

    2、构造器虽然有返回值(返回该类的对象),但是不能定义返回类型 (返回值的类型肯定是本类),不能在构造器里调用 return。 3、如果我们没有定义构造器,则系统会自动定义一个无参的构造函数。...static关键字 在类中,用 static 声明的成员变量为静态成员变量. 1、它为该类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显式初始化, 2、对于该类的所有对象来说,static...4、用static声明的方法为静态方法 5、不需要对象,就可以调用(类名.方法名) 6、在调用该方法时,不会将对象的引用传递给它,所以在 static 方法中不可访问非 static 的成员。...7、可以通过对象引用或类名(不需要实例化)访问静态成员。...this 就由此产生了,通过将 this (其实还有 super)隐式的传入到每个普通方法上系统就可以分辨出是谁在调用这个方法,这样就可以达到一个方法多个对象使用。

    36220

    【C++】深入剖析C++11新特性

    按照语法,右值引用只能引用右值,但右值引用一定不能引用左值吗?因为:有些场景下,可能真的需要用右值去引用左值实现移动语义。当需要用右值引用引用一个左值时,可以通过move函数将左值转化为右值。...(例如我们不能用类的模版参数来作为完美转发的参数,因为在初识化类的时候就已经实例化了。) ---- 八、新的类功能 1.默认成员函数 原来C++类中,有6个默认成员函数: 1....包装器包装类的成员函数的时候,非静态函数第一个参数需要传类名,在赋值的时候需要带上类域,函数需要取地址,静态函数只需要在赋值的时候需要带上类域(这里建议都取地址,方便记忆)。...原因:静态成员函数没有 this 指针,所以 function 类实例化时不需要添加一个成员函数所属类的类型参数,在调用时也不需要传递一个成员函数所属类的对象;而非静态成员则有,所以需要借助类对象来传递...在使用包装了类的成员函数的包装器的时候,我们第一个参数也要传一个类对象。

    60340

    JDK1.9-引用类型用法总结

    基本类型可以作为成员变量、作为方法的参数、作为方法的返回值,那么当然引用类 型也是可以的。 1.1 class作为成员变量 在定义一个类Role(游戏角色)时,代码如下: ?...定义武器类,将增加攻击能力: ? 定义穿戴盔甲类,将增加防御能力,也就是提升生命值: ? 定义角色类: ?...,对它进行赋值的操作,实际上,是赋给它该类的一个对象。...接口作为成员变量时,对它进行赋值的操作,实际上,是赋给它该接口的一个子类对象。 4.3 interface作为方法参数和返回值类型 当接口作为方法的参数时,需要传递什么呢?...所以,当我们看见 List 接口作为参数或者返回值类型时,当然可以将 ArrayList 的对象进行传递或返回。 请观察如下方法:获取某集合中所有的偶数。

    40010

    【Example】C++ 回调函数及 std::function 与 std::bind

    一,回调函数 回调函数的创建步骤大概为: 1,声明一个函数指针类型。 2,拟写使用回调函数的函数,将函数指针类型及变量名声明作为参数传递。...3,拟写符合函数指针类型的实现函数,将实现函数的指针作为参数传递给使用它的函数。...二、std::function 与 std::bind 上面演示了最简单的回调函数创建及使用,然而,上面的代码却出现了一个局限性,就是: 如果需要去回调一个类成员函数,函数指针则无法指向类成员函数。...当用作类成员函数的绑定时,第一个参数仍然是作为类成员的可调用对象引用,第二个参数则是对象的指针,而第三个参数开始对应可调用对象的参数表。...: 1,调用指向非静态成员函数指针或指向非静态数据成员指针时,首参数必须是引用或指针(可以包含智能指针,如 std::shared_ptr 与 std::unique_ptr),指向将访问其成员的对象。

    5K30

    闭关多日,整理一份C++中那些重要又容易忽视的细节

    名空间的支持是一项C++特性,旨在让我们比阿尼写大型程序以及将多个厂商的现有代码组合起来的程序时更容易。...返回引用时,应避免返回函数终止时不再存在的内存单元引用(在指针里说过同样的话)。 为避免这种问题,最简单的方法就是:返回一个作为参数传递给函数的引用。 ---- 何时使用引用参数? 想用的时候呗。...数据对象是类对象,使用const引用。类设计的语义常常要求使用引用,因此,在传递类对象参数的标准方式是按引用传递。 对于修改调用函数中数据的函数: 如果数据对象是内置数据类型,使用指针。...派生类对象包含一个指向独立地址表的指针。如果派生类提供了虚函数的新定义,该函数表将保存新函数的地址;如果派生类没有重新定义虚函数,该vtbl将保存函数原始版本的地址。...cout函数通过对象的引用直接访问私有变量的例子!"

    59410

    C++中与类有关的注意事项(更新中~~~)

    ,尽管先定义了它的对象成员,不过它不会立即调用其默认构造函数,而是去看看你有没有写相应的初始化(注意:这里是指在类里面,而不是指main函数内以及类外函数,对于类外函数应注意,在定义类的同时必须给它附上一定的值...类里面的任何成员变量在定义时是不能初始化的,尽管你可以编译过。 类的一个对象调用了一次构造函数之后,是不允许再次调用构造函数的。...如果一个类是另一个类的友元类,那么该类的友元函数将不能访问另一个类的私有成员。...关于运算符重载需要注意以下几点: 作为类成员的重载函数(以类名作为返回类型),其形参看起来比操作数少一个,因为隐式传递,限定为第一个操作数,举个例子,如下: T operator + (const Data...+,自增完后返回一个临时的*/ 赋值必须返回对*this的引用(如+=, =) 下标运算符 [ ] 一般作为类成员函数,中间加上const就更好了。

    71720

    static的使用总结

    也不能在类的构造函数中初始化该成员,因为静态数据成员为类的各个对象共享,否则每次创建一个类的对象则静态数据成员都要被重新初始化静态成员可以被初始化,但只能在类体外进行初始化。...一般形式:数据类型 类名::静态数据成员名=初值。 静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。你在一个对象里给它赋值,其他对象里的该成员也会发生变化。...静态成员属于整个类所有,不需要依赖任何对象,它在对象中不占用存储空间。 静态成员仍然遵循public,private,protected访问准则。 可以通过类名直接访问public 静态成员。...可以通过对象名访问public静态成员。 类的静态函数 静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员,所以对静态成员的引用不需要用对象名。...静态函数成员必须通过参数列表中传递类的对象指针来实现对类对象的非静态成员变量进行访问。

    1.1K20

    function和bind

    { void(*pmf)(int) = &myfunc;//定义一个函数指针pmf并给了初值 pmf(15);//调用函数,这就是可调用对象 } 1.2.具有operator()成员函数的类对象...(仿函数) 仿函数的定义:仿函数(functor),它的行为类似于函数的东西(something that performs a function) C++仿函数是通过在类中重载()运算符实现,又称函数对象...,它可以将一个类类型的对象转换为另一种类型,这里operator tfpoint() 是将一个T2类型的对象转为一个函数指针类型,所以tc2(50)调用了由类型转换函数返回的函数指针,并将参数50传给了他...++11 std::function是个类模版,用来装各种可调用对象,但不能装类成员函数指针 std::function类模版的特点,就是能够通过给它指定模版函数,它就能够用统一的方式来处理函数 2.1...,所以这个a实际是值传递 bind对于不事先绑定的参数,通过std::placeholder传递的参数,是通过引用传递的,所以b实际是引用传递 3.2bind怎么绑定成员函数 class CT { public

    10610
    领券