函数
常规函数 主函数 空函数 递归函数
内联函数inline
函数模板:模板是基于用户为模板参数提供的参数在编译时生成普通类型或函数的构造
模板函数
类的成员函数也和普通函数一样,都有返回值和参数列表,它与一般函数的区别是:
成员函数是一个类的成员,出现在类体中,它的作用范围由类来决定;也可以只在类体中声明函数,而将函数定义放在类体外面
而普通函数是独立的,作用范围是全局的,或位于某个命名空间内。
特殊成员函数 是类(或结构)成员函数,在某些情况下,编译器会自动为你生成。
包括默认构造函数、析构函数、复制构造函数和复制赋值运算符,以及移动构造函数和移动赋值运算符。
成员函数又可以分为【静态成员函数】与【非静态成员函数
静态成员函数: 静态成员函数没有 this 指针
非静态成员函数而言,this 指针指向每一个对象的本地数据,对对象内成员的存取通过 this 指针来完成。
构造函数:C++用以初始化对象的数据成员的一种函数
友元函数 friend
虚函数 纯虚函数
虚函数就是类的成员函数前面加上virtual关键字的函数
函数原型-函数定义-函数调用
库函数
函数原型--提供函数到编译器的接口
函数输入参数 parameterList:参数类型和数量
argument 实参
parameter 形参
基本数据类型(内建类型)、指针或引用、类(结构体)
将数组视为指针-数组名解释为其第一个元素的地址--仅仅在函数原型或者函数头中--int *arr 等价于 int arr[]
地址运算符用于数组名--将返回整个数组的地址
函数返回值:
没有返回值 void函数
有返回值:
不能直接返回数组--可将数组放置在结构体或者对象组成部分来返回
返回值可以除了数组之外的其他任何类型-- int float point struct class
函数功能:
函数参数传递
1、值传递:对实参的值进行了拷贝,因为传递的只是拷贝的副本,所以无法对实参的值进行修改。
如果形参是类的对象,利用值传递的话每次都要调用类的构造函数构造对象,效率比较低
2、指针传递:对指针的值进行了拷贝,因为传递的只是拷贝的副本,所以无法修改指针所指向的地址。(修改指针所指向的地址,需传入指针的指针)
发生拷贝,拷贝的是指针的值,而不是指针指向的值 指针的值不可修改,所指向的对象的值可修改 ;修改指针的值需要传指针的指针
传递指向对象的指针-对象的地址
3、引用传递:引用只是一个别名,不产生拷贝,可以对实参的值进行修改
引用变量 & 作为类型标识符号
递归函数
常规函数和内联函数
常规函数--处理函数调用机制的时间+ 执行函数代码的时间
内联函数--将相应的函数代码替换为函数调用--运行速度比常规函数稍快,代价是占用更多的内存
关键字 inline
函数与编译器和硬件
01.函数原型不要求提供变量名,需要提供类型列表,原型时一条语句,需要以分号结束;
原型在c++中必不可少,在ANSI C中是可选项
C++ 不指定参数列表时,应使用省略号
与编译器之间关系--在编译截断进行原型检查--静态类型检查-- static type checking
02.返回值--将返回值复制到指定的CPU寄存器或者内存单元中--调用程序查看该内存单元
函数返回指和调用函数就该内存单元中存储的数据类型达成一致
函数
函数指针:
将函数作为参数传递-必须传递函数名--一定要区分传递的是函数的地址还是函数的返回值--带括号和不带括号
函数多态-函数重载
多态--函数重载 使用多个同名函数--使用不同的参数列表(形参类型/个数/类型顺序中的至少一个不同的函数)
函数模板
使用泛型来定义函数--关键字 template typename
函数模板重载
符号说明
& 指示变量的地址
& 类型标识符--用来声明引用
* 解除引用运算符
对象-方法与函数
成员函数
在类体中直接定义函数时,不需要在函数名前面加上类名,因为函数属于哪一个类是不言而喻的。
但当成员函数定义在类外时,就必须在函数名前面加上类名予以限定。::被称为域解析符(也称作用域运算符或作用域限定符),用来连接类名和函数名,指明当前函数属于哪个类。
成员函数必须先在类体中作原型声明,然后在类外定义,也就是说类体的位置应在函数定义之前
构造函数具有与类相同的名称,没有返回值。 可以定义所需数量的重载构造函数,以各种方式自定义初始化。
析构函数是一个成员函数,在对象超出范围或通过调用 delete 显式销毁对象时,会自动调用析构函数。 析构函数具有与类相同的名称,前面是波形符 (~)
虚函数却是在运行时动态确定的。虚函数对应的成员函数是根据对象的类型确定的,而非指针或引用指向对象的类型确定。
编译器会为具有虚函数的类生成一个虚函数表,同时在每一个类对象中添加指向虚函数表的指针,每一个虚函数有唯一的索引值。虚函数会被转化为对虚函数表中不同表项对应函数的调用形式,调用一个虚函数需要额外的指针解引用负载
纯虚函数只能被非抽象派生类实现,超类不能实现纯虚函数
作比较
C++类多态
函数重载,运算符重载,虚函数
01.静态多态也称为编译期间的多态,编译器在编译期间完成的)静态多态,也称为静态绑定或前期绑定(早绑定):
函数重载和函数模板实例化出多个函数(本质也是函数重载)。
02.运行时的多态
virtual修饰的类成员函数被称作虚函数-虚函数这里的virtual是为了实现多态
动态多态:通过重写实现,是通过虚函数完成重写,发生在不同的类(父类与派生类之间)
03.重载和重写,在C++中还有一个“隐藏”。隐藏是通过继承,在派生类中创建于父类同名函数实现。具体规则如下:
(1) 如果派生类的某个函数与父类的某个同名,但参数不同。此时,无论是否有virtual关键字,父类函数将被隐藏。
(2) 如果派生类的函数与父类的函数同名,并且参数也相同,但父类该函数没有virtual关键字。此时父类的该函数在派生类中将被隐藏
虚函数
因为静态成员函数是类函数(所有对象公用同一个),所以静态成员函数不能是虚函数。
普通函数不能声明为虚函数,只有应用于继承关系类的函数才可以。
内联函数不能是虚函数,因为内联函数不能在运行时动态确定位置
构造函数不能是虚函数,因为虚函数是通过虚函数表,而指向虚函数表的指针是在创建对象后才有,即等构造函数执行完才初始化。
析构函数可以是虚函数,且析构函数尽量是虚函数。
Java 实现多态有 3 个必要条件:继承、重写和向上转型。
1.静态绑定/编译时绑定/早期绑定/方法重载.(在同一类中)
2.动态绑定/运行时绑定/后期绑定/方法覆盖.(在不同的类中)
Java Java的函数重载范围是整个继承体系中的可见函数
方法的重写Overriding和重载Overloading是Java多态性的不同表现。
重写Overriding是父类与子类之间多态性的一种表现,
重载Overloading是一个类中多态性的一种表现
overload:是重载的意思,这没啥能混淆的了,就是在同一个类当中,为了增加通用性,写了很多方法,
这些方法只有一个要求,参数的数量和类型不同,
但返回值和方法属性必须相同,否则不属于重载
override有人翻译是重写OverWrite,有人翻译是覆写,覆盖等。父类和子类之间-子类的方法重写了(覆盖)父类的方法
因为它是在父类中声明方法(一般是抽象的),在子类中根据需求去具体定义方法的行为(即modify behavior as needed)
它要求override的方法有相同的名字、相同的参数、相同的返回值类型
(即the same name, number and type of parameters, and return type)
它是一种晚绑定,是决定java多态的一种方式
代码示例
#include<iostream>
using namespace std;
void simple();
int main()
{
cout << "main function will call simple() function: "<<endl;
simple();
return 0;
}
void simple()
{
cout <<"this is a simple function. \n";
}
标签:函数,--,成员,概览,多态,C++,重载,指针
From: https://www.cnblogs.com/ytwang/p/17022601.html