类的成员函数

C++学习(16)—— 类模板

眉间皱痕 提交于 2020-02-09 12:55:36
1.类模板语法 类模板作用: 建立一个通用类,类中的成员 数据类型可以不具体制定,用一个虚拟的类型来代表。 语法: template<typename T> 类 解释: template —— 声明创建模板 typename —— 表明其后面的符号是一种数据类型,可以用class代替 T —— 通用的数据类型,名称可以替换,通常为大写字母 #include<iostream> #include<string> using namespace std; //类模板 template<class NameType, class AgeType> class Person{ public: Person(NameType name, AgeType age){ this->m_name = name; this->m_age = age; } void showPerson(){ cout << "name: " << this->m_name << " age:" << this->m_age << endl; } NameType m_name; AgeType m_age; }; void test01(){ Person<string,int> p1("alice", 18); p1.showPerson(); } int main(){ test01(); return 0;

c++ -- 多态(类)

↘锁芯ラ 提交于 2020-02-07 02:12:58
假期 2020.02 .06 学习资源来源于中国MOOC以及c语言中文网 前言 c++之所以是面向对象的是因为该语言既支持类也支持多态,而多态是什么呢? 定义 多态就是同一个操作作用于不同的对象会产生不同的结果。这个操作一般指的是函数的调用等等。 标准定义 是对于通过基类指针调用基类和派生类中都有的同名、同参数表的虚函数的语句,编译时并不确定要执行的是基类还是派生类的虚函数;而当程序运行到该语句时,如果基类指针指向的是一个基类对象,则基类的虚函数被调用,如果基类指针指向的是一个派生类对象,则派生类的虚函数被调用。这种机制就叫作“多态(polymorphism)”。 虚函数 :在成员函数前加 virtual 即可生成虚函数。注意虚函数只能在类的内部定义成员函数时使用,不能在类外部写成员函数时使用,构造函数与静态成员都不能是虚函数。 多态类 :包含虚函数的类称为“多态类”。 如何构成多态 常判断条件是 有继承关系 继承关系中有同名的虚函数,并且是覆盖关系 存在基类的指针,指向派生类的虚函数,或者引用 那么什么时候声明虚函数呢? 成员函数所在的类是否是基类 成员函数在继承后是否会被新定义或者更改,是的话,需要;否则,不需要。 多态应用 举一个指针类型的例子: 注意:多态的语句调用哪个类的成员函数是在运行时才能确定的,编译时不能确定。多态的函数调用语句被称为是“动态联编”

特化与重载

◇◆丶佛笑我妖孽 提交于 2020-02-06 05:50:59
现在我们已经知道如何使一个泛型定义扩展成一些相关的类家族和函数家族。但是有些时候,我们需要同一个名字的函数的不同实现( 透明定义 ),为的是在不同情况下获得较高的性能,在这种情况下就不是简单的参数替换就能够解决的。 一、透明定义使用的技术 对于函数模板使用的透明定义的技术是: 函数模板的重载 对于类模板的使用透明定义的技术是: 类模板的特化(全局特化和局部特化) 二、重载函数模板 两个名称相同的模板可以同时存在,还可以对他们进行实例化。 template<typename T> int f(T) { retrun 1; } template<typename T> //重载版本 int f(T*) { return 2; } 如果我们用int*来替换第一个模板参数T,用int来替换第二个模板参数T,那么将会获得两个具有相同参数类型和返回类型的同名函数。 int main() { cout << f<int*>((int*)0) << endl; //这里回实例化出两个实体,根据实参(int*)选择接近的 cout << f<int>((int*)0) << endl; //这里会实例化出两个实体,根据实参(int*)选择接近的 } 注意:表达式0是一个整数,而不是一个null指针常量。只有在发生特定的隐式转型之后参会成为一个null的指针常量

C++ 模板何时被实例化

匆匆过客 提交于 2020-02-06 05:30:07
今天编程时碰到一个问题,写了一个单例的类模板,之前程序一直能跑,但今天使用了其中一个函数时却报错。后续查错,发现是自己忘记写结束符号了。 这就引出我知识点的不足了——之前为啥能跑正常?错误一只存在,为啥总是能编译通过?类中的函数何时才被实例化?类何时实例化?实例化的类是不是所有的函数都同时被实例化? 整理和理解网上资料后获得如下总结: 1. 在我们使用类模板时,只有当代码中使用了类模板的一个实例的名字,而且上下文环境要求必须存在类的定义时,这个类模板才被实例化。   1.1声明一个类模板的指针和引用,不会引起类模板的实例化,因为没有必要知道该类的定义 。   1.2 定义一个类类型的对象时需要该类的定义,因此类模板会被实例化 。   1.3 在使用sizeof()时,它是计算对象的大小,编译器必须根据类型将其实例化出来,所以类模板被实例化 .   1.4 new表达式要求类模板被实例化。   1.5 引用类模板的成员会导致类模板被编译器实例化。   1.6 需要注意的是,类模板的成员函数本身也是一个模板。标准C++要求这样的成员函数只有在被调用或者取地址的时候,才被实例化。 用来实例化成员函数的类型,就是其成员函数要调用的那个类对象的类型 总结1很好的解释了为啥我的程序在调用特定的成员函数时才会报错。 不过上面的介绍还是比较笼统,还有很多的细节点需要注意到,从网上转载如下:转载链接

C++ 模板与泛型编程

跟風遠走 提交于 2020-02-06 05:27:24
《C++ Primer 4th》读书笔记 所谓泛型编程就是以独立于任何特定类型的方式编写代码。泛型编程与面向对象编程一样,都依赖于某种形式的多态性。 面向对象编程中的多态性在运行时应用于存在继承关系的类。我们能够编写使用这些类的代码,忽略基类与派生类之间类型上的差异。 在泛型编程中,我们所编写的类和函数能够多态地用于跨越编译时不相关的类型。一个类或一个函数可以用来操纵多种类型的对象。 面向对象编程所依赖的多态性称为运行时多态性,泛型编程所依赖的多态性称为编译时多态性或参数式多态性。 模板是泛型编程的基础。模板是创建类或函数的蓝图或公式。 函数模板 模板定义以关键字 template 开始,后接模板形参表,模板形参表是用尖括号括住的一个或多个模板形参的列表,形参之间以逗号分隔。模板形参表不能为空。 template <typename T> int compare(const T &v1, const T &v2) { if (v1 < v2) return -1; if (v2 < v1) return 1; return 0; } 模板形参可以是表示类型的类型形参,也可以是表示常量表达式的非类型形参。类型形参跟在关键字 class 或 typename 之后定义.在函数模板形参表中,关键字 typename 和 class 具有相同含义,可以互换使用

类2(构造)

こ雲淡風輕ζ 提交于 2020-02-05 05:48:35
构造函数: 每个类都定义了它的对象被初始化的方式,类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数叫做构造函数。构造函数的任务是初始化类对象的数据成员,无论何时只要类的对象被创建,就会执行构造函数。 构造函数的名字和类名相同。和其他函数不一样的是,构造函数没有返回类型。除此之外类似于其他的函数,构造函数也有一个(可能为空的)参数列表和一个(可能为空的)函数体。类可以包含多个构造函数,和其他重载函数差不多,不同的构造函数之间必须在参数数量或者参数类型上有所区别(类的其他成员函数也可以重载,规则和一般函数重载一样)。 不同与其他成员函数,构造函数不能被声明成 const 的,当我们创建类的一个 const 对象时,直到构造函数完成初始化过程,对象才能真正取得其 "常量" 属性。因此,构造函数在 const 对象的构造过程中可以向其写值。 合成的默认构造函数: 如果我们没有显示地定义构造函数,那么编译器就会隐式地定义一个默认构造函数(合成的默认构造函数)。一般情况下合成的构造函数按照如下规则初始化类的数据成员: 1.如果存在类内的初始值,用它来初始化成员 2.否则,默认初始化 合成的默认构造函数只适合非常简单的类,比如上一篇博客中的 Sales_data 类。对于一般类来说是必须要定义默认构造函数的: 1

从C#到Python —— 4 类及面向对象

▼魔方 西西 提交于 2020-02-04 13:18:08
如果你熟悉C#,那么对类(Class)和面向对象(Object Oriented)应该不会陌生。Python与C#一样,能够很好地支持面向对象的编程模式。本章对Python中面向对象编程的基本知识进行介绍,并将其与C#中的对应部分进行比较。 4.1 类的定义与实例化 4.1.1 类的定义 与C#一样,Python使用class关键字定义一个类。一个最简单的类定义语句如下: 1 class A:2 pass 它等价于C#中的 class A{}。当然,以上语句没有任何实际意义,它只是告诉我们什么是定义一个类所必需的,即:class关键字,类名和冒号,pass关键字只用来占位,相当于C#中花括号的作用。 4.1.2 类的实例化 类是定义对象格式的模板,而对象则是类的实例,通过类创建对象的过程称为类的实例化。在C#中,需要使用new关键字实例化一个类,例如 A a = new A(); 在上条语句中,C#完成了两件事情:首先声明一个类型为A的变量a,然后用new运算符创建一个类型为A的对象,并将该对象的引用赋值给变量a。而在Python中没有new关键字,同时它是一种动态语言,不需要事先指定变量的类型,只需要: a = A() 即可创建一个类型为A的对象,看起来好像是将类当作一个函数调用,返回值是新创建的对象。 4.2 类的成员变量 4.2.1 为类添加数据

原来Matlab也可以有类

风流意气都作罢 提交于 2020-02-04 04:20:05
通常一个类应该包含四个基本的成员函数: 构造函数 ―― 与类名相同,可以在其中完成成员初始化的工作; 显示函数 ―― 名为display,用于显示成员的数据; 赋值函数 ―― 名为set,用于设置类成员的数值; 取值函数 ―― 名为get,用于读取类成员的函数。 与C++的类不同的是,MATLAB的类不需要特别的析构函数。如果类用到了一些特殊的内容需要释放的话,可以编写一个成员函数,比如classclear,用包来释放所占用的资源。 下面用一个简单的例子类介绍一些类如何使用。定义一个名为list的类,它有两个数据成员x和y,希望通过一个成员函数prod()来获取x和y的乘积。本例的类是这样的: 类名: list 成员变量:x,y 成员函数: list:构造函数 display:显示函数 get:取值函数 set:赋值函数 prod:计算函数现在就来建立它。 (1) 在工作目录上建立一个子目录: cd E:\MyProgram\matlab7\chap4 mkdir @list 类名前面要加上一个字符'@’,对于这样形式的目录里所有保存的M文件,MATLAB都认为是类的成员函数。 (2) 编写5个成员函数的M文件保存在E:\MyProgram\matlab7\chap4\@list 目录下: % list.mfunction d = list(x,y) d.x=x; d.y=y; d

C++ 类定义

自古美人都是妖i 提交于 2020-02-03 21:53:06
1、在类内部定义的函数默认为inline;   在类内部声明成员函数是必须得,定义成员函数是可选的。 2、将关键字加在形参表之后,可以将成员函数声明为常量   const 必须同时出现在声明和定义中。 3、可以声明一个类,而不定义它   class screen;   向前声明,类screen是一个不完全类型   不完全类型只能以有限方式使用:     不能定义该类型的对象     只能定义指向该类型的指针及引用     用于声明(而不是定义)使用该类型作为形参类型、返回类型的函数。 4、返回*this    在普通非const成员函数中,this的类型是一个指向类类型的const指针,可以改变this所指向的值,但不能改变this所保存的地址    在const成员函数中,this是一个指向const类类型的const指针    const成员函数只能返回*this作为一个const引用。    可以在非const对象上调用调用const成员函数,但不能在const对象上调用普通成员 5、基于成员函数是否为const,可以重载一个成员函数   const对象只能使用const成员   非const对象可以使用任一版本,但const版本是一个更好地匹配 6.默认构造函数   为所有形参提供默认实参的构造函数也定义了默认构造函数   一个类哪怕只定义了一个构造函数

类成员函数参数和类成员变量的可见性

痞子三分冷 提交于 2020-02-03 00:10:06
类成员函数参数和类成员变量的可见性 一、如下示例 #include "iostream" using namespace std; class point{ public: int x; int y; point() {} point(int a,int b){x=a;y=b;} void output() { cout<<x<<endl<<y<<endl; } void input(int a,int y) { x=a; y=y; } }; int main() { point pt(5,5); pt.input(10,10); pt.output(); return 1; } 二、问题 输出结果为10,5。不是我们10,10,为什么呢? 因为相对局部变量隐藏了外层局部变量的缘故。在 void input(int a,int y) { x=a; y=y; } 函数中,类的成员变量y被形参y所屏蔽隐藏,所以实际上是自己给自己赋值。 三、解决方法两个: 1、void input(int a,int b) { x=a; y=b; } 2、用this指定 void input(int x,int y) { this.x=x; this.y=y; } 来源: CSDN 作者: hopegrace 链接: https://blog.csdn.net/hopegrace/article