类的成员函数

类的this指针

空扰寡人 提交于 2020-03-30 16:42:35
   类的this指针有以下特点:    (1)this只能在成员函数中使用。   全局函数、静态函数都不能使用this。   实际上,成员函数默认第一个参数为T* const this。   如: class A{public: int func(int p) {}}; 其中,func的原型在编译器看来应该是: int func(A* const this, int p); (2)由此可见,this在成员函数的开始前构造,在成员的结束后清除。   这个生命周期同任何一个函数的参数是一样的,没有任何区别。   当调用一个类的成员函数时,编译器将类的指针作为函数的this参数传递进去。如: A a;a.func(10); 此处,编译器将会编译成: A::func(&a, 10); 看起来和静态函数没差别,对吗?不过,区别还是有的。编译器通常会对this指针做一些优化,因此,this指针的传递效率比较高——如VC通常是通过ecx寄存器传递this参数的。    (3)几个this指针的易混问题。    1)this指针是什么时候创建的?   this在成员函数的开始执行前构造,在成员的执行结束后清除。   但是如果class或者struct里面没有方法的话,它们是没有构造函数的,只能当做C的struct使用。采用TYPE xx的方式定义的话,在栈里分配内存

7、群体类和群体数据的组织-1.函数模板和类模板

巧了我就是萌 提交于 2020-03-26 09:17:56
基本数据类型是c++编译系统预定义的,而自定义类型的数据是 由多个基本类型或自定义类型 的元素组成的,我们称之为 群体数据 。 对于群体数据,仅有系统预定义的操作是不够的,在很多情况下,还需要设计与某些具体问题相关的特殊操作,并按照面向对象的方法将数据与操作封装起来, 这就是群体类 。 群体可以分为两种: 线性群体和非线性群体 。线性群体中的元素 按位置排列有序 。非线性群体 不用位置顺序来标识元素。 关于群体数据的组织是属于数据结构的范畴,这里只介绍两类常用的算法:排序和查找方法。 排序:又称为分类或整理,是将一个无序序列调整为有序的过程。在排序的过程中需要完成两种基本操作 :一是比较两个数的大小,二是调整元素在序列中的位置 。排序方法:直接插入排序、直接选择排序和起泡排序。 查找:是在一个序列中按照某种方式找出需要的特定数据元素的过程。方法:顺序查找、折半查找。 1、函数模板与类模板 通用代码 需要不受数据类型的影响 , 并且可以自动适应数据类型的变化 。 这种程序设计类型称为参数化程序设计 。 模板 是c++支持参数化程序设计的工具,通过它可以实现参数化多态性 。 所谓参数化多态性 , 就是将程序所处理的对象的类型参数化 ,使得一段程序可以用于处理多种不同类型的对象。 1)函数模板 程序员只需对函数模板编写一次, 然后 基于调用函数时提供的参数类型 , c+

C++的类和对象--权限public-private-protected

ぃ、小莉子 提交于 2020-03-22 22:42:24
  类是一种将抽象转换为用户自定义类型的C++工具,它将 数据表示(基本成员)和操作数据的方法(成员函数) 组合成一个整洁的包   两个表格有由自己整理,其他参考自: http://blog.163.com/clevertanglei900@126/blog/static/1113522592010114102759821/    当private,public,protected单纯的作为一个类中的成员权限设置时:    C++的类和对象的权限1 权限 类内部 该类对象 子类(派生类) 友元函数 private 可访问  不可访问   不可访问 可访问 public 可访问 可访问 可访问 可访问 protected 可访问 不可访问  可访问 可访问   private: 只能由该类中的函数、其友元函数访问,不能被任何其他访问,该类的对象也不能访问.    protected: 可以被该类中的函数、子类的函数、以及其友元函数访问,但 不能被该类的对象 访问   public: 可以被该类中的函数、子类的函数、其友元函数访问,也可以由该类的对象访问   注:友元函数包括两种:设为友元的全局函数,设为友元类中的成员函数    当private,public,protected作为继承方式时: C++的类和对象的权限2(相对于基类成员) 继承方式 基类对象 派生类 派生类对象

C++类成员函数指针使用介绍

喜欢而已 提交于 2020-03-20 01:15:27
3 月,跳不动了?>>> 前言 在之前写过的博客中有介绍过函数指针和指针函数的区别和简单用法(文章在这里),当时的Demo非常简单,都是C语言的写法,但是当在C++中直接像C那样使用类成员函数指针时就会报错:reference to non-static member function must be called 所以如果是C++中的成员函数指针其使用方法是有区别的,这里针对不同的场景做个补充说明。 类成员函数的指针(非静态) 指向类成员函数的指针与普通函数指针的区别在于,前者需要匹配函数的参数类型和个数以及返回值类型,还要匹配该函数指针所属的类类型。 这是因为非静态的成员函数必须被绑定到一个类的对象或者指针上,才能得到被调用对象的this指针,然后才能调用指针所指的成员函数(所有类的对象都有自己数据成员的拷贝,但是成员函数都是共用的,为了区分是谁调用了成员函数,就必须有this指针,this指针是隐式的添加到函数参数列表里去的)。 所以,对于类成员函数的指针使用包含以下几个步骤: 声明: 指向类的成员函数的指针需要在指针前面加上类的类型,格式为: typedef 返回值 (类名::*指针类型名)(参数列表); 赋值: 需要用类的成员函数地址赋值,格式为: 指针类型名 指针名 = &类名::成员函数名; 1 注意:这里的这个&符号是比较重要的:不加&

C++类模板解析

旧时模样 提交于 2020-03-12 13:43:45
1.3 类模板 1.3.1 类模板语法 类模板作用: 建立一个通用类,类中的成员 数据类型可以不具体制定,用一个 虚拟的类型 来代表。 语法: template<typename T> 类 解释: template --- 声明创建模板 typename --- 表面其后面的符号是一种数据类型,可以用class代替 T --- 通用的数据类型,名称可以替换,通常为大写字母 示例: #include <string> //类模板 template<class NameType, class AgeType> class Person { public: Person(NameType name, AgeType age) { this->mName = name; this->mAge = age; } void showPerson() { cout << "name: " << this->mName << " age: " << this->mAge << endl; } public: NameType mName; AgeType mAge; }; void test01() { // 指定NameType 为string类型,AgeType 为 int类型 Person<string, int>P1("孙悟空", 999); P1.showPerson(); } int

面向对象及类

风格不统一 提交于 2020-03-06 02:08:53
面向对象的特征:封装、继承、多态。 面向对象设计的过程就是一个抽象的过程: 1、发现类,类定义的对象会拥有属性和方法。 2、发现类的属性,对象有的静态特征在类中表示是被称作类的属性。 3、发现类的行为,对象所执行的操作叫做类的方法。 类的定义: class <类名> { private://私有数据和函数 类型 成员变量; 。。。。。。 public://共有数据和函数 类型 成员变量 。。。。。。 }; class是定义类的关键词,和结构体struct差不多。class的后面是用户定义的类名,通常是大写的C字母开始的表示作为类名,C用来表示类,以与对象、函数及其他数据相区别。类中的数据和函数是类的成员,分别称为数据成员和成员函数。需要说明的是,由于数据成员是用变量来描述的,因此数据成员又称为“成员变量”。 类中的public和private表明后面所跟成员的隐秘程度。对于public类成员来说,它们是公有的,能被外面的程序访问;对于private类成员来说,它们是私有的,只能由类中的(成员)函数所使用,而不能被外面的程序所访问。也就是私有的不能被客户所修改看见,共有的可以。 成员函数可以在类中被定义和增加函数体。如果一个成员函数在类体中定义,函数体部分不出现。所有的成员函数都在类体中定义,则函数体部分可以省略。而需要说明的是,当类的成员函数的函数体在类的外部定义时

C++ Primer 学习笔记 第七章 类

依然范特西╮ 提交于 2020-03-03 05:59:05
类的基本思想是数据抽象和封装。数据抽象是一种依赖于接口和实现分离的编程技术,类的接口包括用户所能执行的操作,类的实现则包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。封装实现了类的接口和实现的分离,封装后的类隐藏了它的实现细节,即类的用户只能使用接口而不能访问实现部分。 类要想实现数据抽象和封装,首先需要定义一个抽象数据类型,在抽象数据类型中,由类的设计者负责考虑类的实现过程,而使用该类的程序员只需要抽象地思考类型做了什么,而无须了解类型的工作细节。 我们可以通过抽象数据类型提供的接口来完成某些操作,但如果一个类没有任何接口供用户使用,只有一些数据成员,那这个类就不是抽象数据类型,一旦定义了一些成员函数供类的用户使用,它就变成了了抽象数据类型。 定义和声明成员函数的方式与普通函数差不多,成员函数的声明必须在类的内部,但它的定义既可以在类的内部,也可以在类的外部。定义在类内部的函数是隐式的inline函数。 Sales_data类: struct Sales_data { string isbn ( ) const { return bookNo ; } Sales_data & combine ( const Sales_data & ) ; double avg_price ( ) const ; string bookNo ; unsigned units

c++——成员对象和封闭类

荒凉一梦 提交于 2020-02-28 03:42:12
成员对象:一个类的成员变量是另一个类的对象。包含成员对象的类叫做封闭类。 包含成员对象的封闭类的执行顺序是怎么样的呢? 当封闭类对象生成时: • S1: 执行所有成员对象 的构造函数 • S2: 执行 封闭类 的构造函数 成员对象的构造函数调用顺序 • 和成员对象在类中的说明顺序一致 • 与在成员初始化列表中出现的顺序无关 当封闭类的对象消亡时: • S1: 先执行 封闭类 的析构函数 • S2: 执行 成员对象 的析构函数 析构函数顺序和构造函数的调用顺序相反 友元可以分为两类:友元函数与友元类; 友元函数:一个类的友元函数可以访问这个类的私有成员,要在这个类里用friend关键字声明。 友元类:A声明B为它的友元类,则B成员函数可以访问A的私有成员。 友元关系不能继承,不能传递 this指针的作用:指向成员函数所作用的对象。 静态成员的参数就是程序中列出的参数,而类中非静态成员函数的参数有一个this指针。 静态成员函数不能使用this指针 常量对象:常量函数与常引用。 常量对象:在对象前加一个const关键字,可以是对象不被改变,常量对象只能调用常量成员函数。 常量成员函数:在类的成员函数说明后面可以加const关键字,则该成员函数成为常量成员函数,不能修改成员变量,同名的成员函数加const算函数的重载。 对象作为函数的参数时,用常引用,既不会调用复制构造函数

C++类的六个特殊成员函数

我们两清 提交于 2020-02-28 00:15:25
1.设置六个函数的参数,先让函数运行起来 // // Created by liuhao on 20-1-1. // #include <iostream> //using namespace std; class Stu { private: std::string name = "无名氏 "; int age = 0; int *d = nullptr; public: Stu() { std::cout << name << age << " 执行了无参构造函数!" << std::endl; }; Stu(int a) { std::cout << name << age << " 执行了有参构造函数!" << std::endl; }; Stu(const Stu &s) { std::cout << name << age << " 执行了拷贝构造函数!" << std::endl; }; Stu &operator=(const Stu &s) { std::cout << name << age << " 执行了拷贝赋值运算符函数!" << std::endl; }; Stu(Stu &&s) { std::cout << name << age << " 执行了移动构造函数!" << std::endl; }; Stu &operator=(Stu &&s) {

《C++大学教程》 第9章 类的深入剖析:抛出异常 笔记(上)

喜欢而已 提交于 2020-02-26 22:17:12
文章目录 0. 前言 9. 类的深入剖析:抛出异常 9.2 Time类实例研究 Time类的定义 Time类的成员函数 Time类的成员函数setTime和异常的抛出 Time类的成员函数printUniversal 在类定义外部定义成员函数与类的作用域 成员函数与全局函数(也称作自由函数) 使用Time类 引用补充 用无效值调用setTime 组成和继承概念介绍 对象大小 9.3 类的作用域和类成员的访问 类作用域和块作用域 圆点成员选择运算符(.)和箭头成员选择运算符(->) 通过对象、引用、指针访问类的public成员 9.4 访问函数和工具函数 访问函数 工具函数 9.5 Time类实例研究:具有默认实参的构造函数 关于Time类的设置函数、获取函数和构造函数的补充说明 C++11:重载的构造函数和委托构造函数 9.6 析构函数 9.7 何时调用构造函数和析构函数 全局作用域内对象的构造函数和析构函数 局部对象的构造函数和析构函数 static局部对象的构造函数和析构函数 遇到的问题 运行结果 9.8 Time类实例研究:微妙的陷阱——返回private数据成员的引用或指针 9.9 默认的逐个成员赋值 9.10 const对象和const成员函数 使用const和非const成员函数 结语 参考链接 0. 前言 《C++大学教程》 第9章 前10节 笔记更一下。