类的成员函数

C/C++对运算符重载详解

余生颓废 提交于 2020-01-14 12:27:12
下面来进行这段代码的分析: struct node { //定义一个结构体node(节点) int x; int y; int len; //node中有3个成员变量x,y,len bool operator <( const node &a) const { //重载<操作符。可以对两个node使用<操作符进行比较 return len<a.len; } }; 括号中的const表示参数a对象不会被修改,最后的const表明调用函数对象不会被修改! 想必看到这里对重载运算符算是有一丁点的了解吧,下面看些理论文字,更加清楚的了解关系! Return Top 重载运算符的介绍 C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引人的特性之一。   运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作。运算符函数的定义与其他函数的定义类似,惟一的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。运算符函数定义的一般格式如下: <返回类型说明符> operator <运算符符号>(<参数表>) {

一般函数指针和类的成员函数指针

↘锁芯ラ 提交于 2020-01-05 04:25:47
转载请注明原文网址: http://www.cnblogs.com/xianyunhe/archive/2011/11/26/2264709.html 函数指针是通过指向函数的指针间接调用函数。函数指针可以实现对参数类型、参数顺序、返回值都相同的函数进行封装,是多态的一种实现方式。由于类的非静态成员函数中有一个隐形的this指针,因此,类的成员函数的指针和一般函数的指针的表现形式不一样。 1、指向一般函数的指针 函数指针的声明中就包括了函数的参数类型、顺序和返回值,只能把相匹配的函数地址赋值给函数指针。为了封装同类型的函数,可以把函数指针作为通用接口函数的参数,并通过函数指针来间接调用所封装的函数。 下面是一个指向函数的指针使用的例子。 #include <iostream.h>/*指向函数的指针*/typedef int (*pFun)(int, int);int Max(int a, int b){ return a > b ? a : b;}int Min(int a, int b){ return a < b ? a : b;}/*通用接口函数,实现对其他函数的封装*/int Result(pFun fun, int a, int b){ return (*fun)(a, b);}void main(){ int a = 3; int b = 4; cout<<"Test

C++——模板、数组类

拥有回忆 提交于 2020-01-03 10:11:29
1、函数模板: 可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。 声明方法: template<typename 标识符> 函数声明 求绝对值的模板 #include<iostream> ……编译器从调用abs函数时实参的类型,推导出函数模板的类型参数。 using namespace std; ……如该题从调用abs(int)推导出模板中类型参数T为int型。 template<typename T> ……当类型参数的含义确定后,编译器将函数模板为样板,生成一个函数: T abs(T x) …… int abs(int x) { return x<0?-x:x; } ……{return x<0?-x:x;} int main() { int n=-5; double d=-5.5; cout<<abs(n)<<endl; cout<<abs(d)<<endl; }//运行结果:5 5.5 2、类模板: 使用类模板用户可以为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本类型和自定义类型)。 类模板声明: template <模板参数表> class 类名 {类成员声明} 如果需要在类模板之外定义其成员函数,则要采用 template <模板参数表> 类型名 类名<T>::函数名(参数表)

C++类的成员变量和成员函数的介绍

此生再无相见时 提交于 2019-12-29 04:50:44
类可以看做是一种数据类型,它类似于普通的数据类型,但是又有别于普通的数据类型。类这种数据类型是一个包含成员变量和成员函数的集合。 类的成员变量和普通变量一样,也有数据类型和名称,占用固定长度的内存。但是,在定义类的时候不能对成员变量赋值,因为类只是一种数据类型或者说是一种模板,本身不占用内存空间,而变量的值则需要内存来存储。 类的成员函数也和普通函数一样,都有返回值和参数列表,它与一般函数的区别是:成员函数是一个类的成员,出现在类体中,它的作用范围由类来决定;而普通函数是独立的,作用范围是全局的,或位于某个命名空间内。 上节我们在示例中给出了 Student 类的定义 ,如下所示: class Student { public : //成员变量 char *name ; int age ; float score ; //成员函数 void say () { cout <<name << "的年龄是" <<age << ",成绩是" <<score <<endl ; } } ; 这段代码在类体中定义了成员函数。你也可以只在类体中声明函数,而将函数定义放在类体外面,如下图所示: class Student { public : //成员变量 char *name ; int age ; float score ; //成员函数 void say (); //函数声明 } ; /

C#-概念-类:类

北慕城南 提交于 2019-12-27 10:41:48
ylbtech-C#-概念-类:类 类(Class)是 面向对象程序设计 (OOP,Object-Oriented Programming) 实现信息封装的基础 。类是一种 用户定义类型 ,也称 类类型 。每个类包含数据说明和一组操作数据或传递消息的函数。 类的实例称为对象 。 1. 返回顶部 1、 中文名:类 外文名:Class 类 别:一种数据类型 本 质:类型 目录 1 介绍 2 用法 3 特性 4 示例 2、 2. 返回顶部 1、 介绍 一个简单的类图 类是 面向对象程序设计 中的概念,是 面向对象编程 的基础。 类的实质是一种数据类型 ,类似于 int 、char等基本类型, 不同的是它是一种复杂的数据类型 。 因为它的本质是类型,而不是数据,所以不存在于内存中,不能被直接操作,只有被实例化为对象时,才会变得可操作 。 类是对现实生活中一类具有共同特征的事物的抽象 。如果 一个程序里提供的类型与应用中的概念有直接的对应,这个程序就会更容易理解,也更容易修改 。一组经过很好选择的用户定义的类会使程序更简洁。此外,它还能使各种形式的代码分析更容易进行。特别地,它还会使 编译器 有可能检查对象的非法使用。 类的内部 封装 了方法,用于操作自身的成员。 类是对某种对象的定义,具有行为(be-havior),它描述一个对象能够做什么以及做的方法(method)

C++中的类模板详细讲述

随声附和 提交于 2019-12-20 10:25:21
一、类模板定义及实例化 1 . 定义一个类模板: View Code 1 template<class 模板参数表>2 3 class 类名{4 5 // 类定义......6 7 }; 其中,template 是声明类模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个,可以是 类型参数 ,也可以是 非类型参数。 类型参数由关键字class或typename及其后面的标识符构成。非类型参数由一个普通参数构成,代表模板定义中的一个常量。 例: View Code 1 template<class type,int width>2 3 //type为类型参数,width为非类型参数4 5 class Graphics; 注意: (1) 如果在全局域中声明了与模板参数同名的变量,则该变量被隐藏掉。 (2) 模板参数名不能被当作类模板定义中类成员的名字。 (3) 同一个模板参数名在模板参数表中只能出现一次。 (4) 在不同的类模板或声明中,模板参数名可以被重复使用。 View Code 1 typedef string type; 2 3 template<class type,int width> 4 5 class Graphics 6 7 { 8 9 type node;//node不是string类型10 11 typedef double type;//错误

C++中类的定义和类的构造函数

て烟熏妆下的殇ゞ 提交于 2019-12-20 06:50:32
类的定义 class 类名{ 访问范围说明符: 成员变量1 成员变量2 成员函数声明1 成员函数声明2 访问范围说明符: 更多成员变量 更多成员函数声明 ... }; 类的定义要以 ; 结束。 “访问范围说明符”一共有三种,分别是 public、private 和 protected。三者的区别后面会详细介绍,目前暂且都用 public。“访问范围说明符”可以出现任意多次。 “成员变量”的写法与普通的变量定义相同。称其为成员变量,是因为这些变量是一个类的成员。 同样地,“成员函数声明”的写法也与普通的函数声明相同。 一个类的成员函数之间可以互相调用。类的成员函数可以重载,也可以设定参数的默认值。 以前所学的函数不是任何类的成员函数,可称为“全局函数”。 成员变量就代表对象的“属性”,成员函数就代表对象的“方法”。成员变量和成员函数出现的先后次序没有规定。 成员函数的实现可以位于类的定义之外,格式如下: 返回值类型 类名:函数名() { 函数体 } 定义类之后,就可以定义对象了。定义对象的基本方法如下: 类名 对象名; 此处,“对象名”的命名规则和普通变量相同。对象也可以看作“类变量”。 public: int w, h; //成员变量,宽和高 void init( int w_,int h_ ); //成员函数,设置宽和高 int area(); //成员函数, 求面积 int

C++模板编程中只特化模板类的一个成员函数

♀尐吖头ヾ 提交于 2019-12-19 20:36:41
模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数。类模板中大多数成员函数的功能可能是一模一样的,特化时我们可能只需要重新实现1、2个成员函数即可。在这种情况下,如果全部重写该模板类的所有成员函数,不但会增加工作量,也不利于代码的维护。 例如下面的类模板A,只有在模板参数是char*时才需要特化成员函数func(),但其他的成员函数都不需要特化: 1 template <typename _Ty> 2 struct A 3 { 4 // 其他成员函数a 5 // 其他成员函数b 6 // ...... 7 void func() 8 { 9 std::cout << "common type." << std::endl; 10 } 11 }; 12 13 int main() 14 { 15 A<int> i; 16 i.func(); 17 18 A<char*> c; 19 c.func(); 20 21 return 0; 22 } 方法一:通过运行时类型识别,这个方法最简单 1 template <typename _Ty> 2 struct A 3 { 4 // 其他成员函数a 5 // 其他成员函数b 6 // ...... 7 void func() 8 { 9 if (typeid(_Ty) == typeid(char*)) 10

[C++]类的继承与派生

纵然是瞬间 提交于 2019-12-18 06:21:37
继承性是面向对象程序设计的第二大特性,它允许在既有类的基础上创建新类,新类可以继承既有类的数据成员和成员函数,可以添加自己特有的数据成员和成员函数,还可以对既有类中的成员函数重新定义。利用类的继承和派生实现了更高层次的代码可重用性,符合现代软件开发的思想。 C++语言同时支持单一继承和多重继承。单一继承是指派生类只从一个基类继承而来;相应的,多重继承指派生类同时从两个或更多的基类继承而来。java只支持单一继承。 一. 派生类 派生类的定义格式如下: class <派生类名>:[继承方式]<基类名1> [,[继承方式]<基类名2>,...,[继承方式]<基类名n>] { <派生类新增的数据成员和成员函数定义> }; 说明: (1)定义派生类关键字可以是class或者是struct,两者区别是:用class定义派生类,默认的继承方式是private,用struct定义派生类,默认的继承方式为public。新增加的成员默认属性也是class对应private属性,struct对应public属性。 (2)基类不能被派生类继承的两类函数是构造函数和析构函数。 二. 3种继承方式下基类成员在派生类中的访问属性 用下面的代码简单理解一下: #include "stdafx.h" #include<iostream> using namespace std; class Base {

Java—(多态、内部类)

我与影子孤独终老i 提交于 2019-12-15 20:14:09
一、多态 多态:可以理解为同一个事物在不同的场合具有不同的形态 分为两种: 编译时多态:在编译期间编译器根据函数实参的类型确定要调哪个函数(这个我们之前已经接触过了,和函数重载差不多,是同名函数,但是参数不同)编译时的多态性是通过函数重载或运算符重载来实现的。 运行时多态:在程序运行期间才会去判断到底会调用哪个函数。这里我们主要讲的就是动态多态。运行时的多态性是通过虚函数与基类指针共同作用实现的。 作用: 静态多态的作用:减少了名字(比如:函数名)的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。 动态多态的作用:多态技术允许将基类指针或基类引用指向子类对象,根据对象的动态类型来决定调用的是哪个子类中的这个同名方法,从而解决了同名覆盖问题,写出了通用的代码,即扩展性优秀的代码,以适应需求的不断变化。 简单举个例子: 猫 x=new 猫(); 动物 y=new 猫(); 1.多态的体现 父类的引用指向自己的子类对象; 父类的引用也可以接收自己的子类对象。 2.多态的前提 必须是类与类之间的关系,要么是继承(extends),要么是实现(implements),通常还有一个前提,就是存在覆盖(重写)。 3.多态的好处 多态的出现大大的提高了程序的可扩展性。但是只能使用父类的引用,访问父类的成员。 4.类型转换(向上转型,向下转型) Anmial a=new Cat();/