并非从0开始的c++ day14
并非从0开始的c++ day14
- 函数的默认参数
- 函数的默认参数的注意事项
- 占位参数
- 占位参数和默认参数混搭
- 函数参数传递的三种方式
- 值传递
- 指针传递
- 引用传递
- 函数重载
- 函数重载的条件
- 调用重载函数的注意
- 函数重载和函数默认参数一起使用,需要注意二义性
- 函数的返回值不作为函数的重载的条件
- 函数重载的原理
- C++调用C语言的函数
- 类和对象的概念
- 类的封装
- 为什么要有封装
- 类的权限
- 尽量把属性设置为私有权限
- C++中类和结构体的区别
函数的默认参数
- 函数的默认参数就是给函数的形参赋值
int myFunc(int a, int b = 0)//int b = 0;这就是函数的默认参数,不一定是0
{return a + b;
}void test01()
{//函数的默认参数的作用//当函数内常要用到的形参的某个值,但偶尔要使用其他值//增加函数的灵活性cout << myFunc(10, 20) << endl;cout << myFunc(10) << endl;
}
函数的默认参数的注意事项
- 函数的默认参数后面的参数必须都是默认参数
//int myFunc2(int a, int b = 0, int c) err
int myFunc2(int a, int b = 0, int c = 2,int d = 3)
{return a + b + c + d;
}
- 函数的声明和实现不能同时有函数的默认参数
void myFunc3(int a, int b );
void myFunc3(int a, int b = 0)
{}
尤其要注意头文件和源文件的函数的冲突,一般都是在源文件中加入默认参数
占位参数
函数的占位参数,占位参数在后面运算符重载时区分前加加或后加加时
void func(int a ,int = 10)//占位参数也有默认值
{}void test02()
{func(10);
}
占位参数和默认参数混搭
void func2(int=10,int a = 20)
{}void test03()
{func2();func2(10);func2(10, 30);
}
默认参数后续都必须是默认参数,占位参数没有这个限制
函数参数传递的三种方式
值传递
void swap(int a, int b)
{int temp = a;a = b;b = temp;
}
指针传递
void swap2(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}
引用传递
void swap3(int& a, int& b)
{int temp = a;a = b;b = temp;
}
上述代码中,值传递是不交换a和b的值,指针传递和引用传递都改变值,但是两者的原理并不一致,参考之前的笔记
函数重载
函数重载是:允许函数名相同,这种现象叫函数重载
函数重载的作用是:为了方便使用函数名
函数重载的条件是:
- 同一个作用域内
- 参数个数不同
- 参数类型不同
- 参数顺序不同
函数重载的条件
//参数的个数不同
void func()
{cout << "func()" << endl;
}void func(int a)
{cout << "func(int a)" << endl;
}//参数的类型不同
void func(char c)
{cout << "func(char c)" << endl;
}//参数的顺序不同
void func(int a, double b)
{cout << "func(int a, double b)" << endl;
}void func( double b, int a )
{cout << "func(double b, int a)" << endl;
}
调用重载函数的注意
严格的类型匹配,如果类型不匹配,那么尝试转换,转换成功就调换,失败就报错
void test01()
{int a = 10;double b = 3.14;func();//func(b); double 转换不了称为int 或者char func(a, b);func(b, a);char c = 'c';func(c);//char转换int 成功,调用int参数的函数
}
函数重载和函数默认参数一起使用,需要注意二义性
void myFunc(int a, int b = 0)
{cout << "myFunc(int a,int b = 0)" << endl;
}void myFunc(int a)
{cout << "myFunc(int a)" << endl;
}void test02()
{//myFunc(10);//err 二义性问题,不知道调用哪个函数
}
函数的返回值不作为函数的重载的条件
编译器是通过调用函数时,传入的参数来判断调用重载的哪个函数,我们调用函数时,不需要写返回值,所以返回值不能成为函数重载的条件
函数重载的原理
函数重载的原理是在汇编时,给各个函数取别名,C语言不能重载的原因就是没有给函数取别名
C++调用C语言的函数
C++的函数在汇编时,会给函数取别名,C语言的不会,这时,如果C++来调用C语言的函数,C++会去找去了别名的函数,但是C语言没有取别名,这时会报错
#ifdef __cplusplus
extern "C"
{#endifvoid func();#ifdef __cplusplus
}
#endif
这是告诉C++编译器,找下面的函数,要以C语言的方式去寻找
类和对象的概念
- 类是自定义数据类型,是C语言的结构体进化而成的
- 对象是类实例化出的,用数据类型定义一个变量
类的封装
- 封装是吧属性(变量)和方法(函数)封装到类内,然后给这些数据赋予权限
为什么要有封装
- 防止乱调用函数和变量,出现错误
- 维护代码更方便
类的权限
子类的类内可以访问父类的保护权限的成员
class Maker
{public://共有权限void set(string Name, int Id){id = Id;name = Name;}void printMaker(){cout << "id = " << id << " name = " << name << endl;}
private://私有int id;string name;protected:int a;
};class Son :public Maker
{void func(){a = 20;//子类的类内可以访问父类的保护权限的成员}
};
//类外不能访问私有权限的成员
//类外可以访问共有权限的成员
//类外不能访问保护权限的成员
//子类的类内可以访问父类的保护权限的成员
//类内是没有权限之分的void test()
{Maker m;m.set("zero", 1);m.printMaker();
}
尽量把属性设置为私有权限
- 可以控制属性的读写权限
- 可赋予客户端访问数据的一致性
- 可以保护属性的合法性
class Maker
{public://写void setName(string Name){name = Name;}//读string getName(){return name;}//写void setAge(int Age){//可以保护属性的合法性if (Age > 0 && Age < 100)age = Age;elsecout << "Age is error number!" << endl;}//读int getId(){return id;}
private:string name;int age;int id;
public:int func;
};
C++中类和结构体的区别
结构体的默认权限是公有的,类的默认权限是私有的
并非从0开始的c++ day14相关推荐
- 并非从0开始的c++之旅 day1
并非从0开始的c++之旅 day1 前言 一.部分c语言基础知识回顾 二.typedef的使用 1.typedef 可以在结构体在被调用时简化struct关键字 2.typedef 可以区分数据类型 ...
- 并非从0开始的c++ day15
并非从0开始的c++ day15 点和圆的关系 案例 要求 点的类 圆的类 全局 构造函数与析构函数 构造函数与析构函数的作用 构造函数和析构函数的运行 有参构造和无参构造函数 构造函数和析构函数的注 ...
- 并非从0开始的c++ day9
并非从0开始的c++ day9 配置文件读写练习 需求 判断文件有效行数 根据字符串判断是否是有效行 文件解析 根据key获取value的值 释放内存 文件加密 加密 解密 函数指针 函数指针基本介绍 ...
- 并非从0开始的c++ day13
并非从0开始的c++ day13 引用 引用基本用法 引用注意事项 数组的引用 引用的本质 const 和#define 区别总结 指针的引用 C和C++的区别 引用的使用场景 常量的引用 bool类 ...
- 并非从0开始的c++ day10
并非从0开始的c++ day10 实现对任意类型数组的排序 预处理 文件包含指令(#include) 文件包含处理 #include<>和#include''区别 宏定义 无参数的宏定义( ...
- 并非从0开始的c++ day12
并非从0开始的c++ day12 C++概述 第一个C++程序 面向对象三大特性 封装 继承 多态 名字控制 C++命名空间 命名空间的注意事项 作用域运算符 using using声明 using编 ...
- 并非从0开始的c++ day6
并非从0开始的c++ day6 二级指针练习-文件读写 位运算 位逻辑运算符 按位取反 ~ 位于(AND):& 位或(OR): | 位异或: ^ 移位运算符 左移<< 右移> ...
- Python 拼图成心2.0【重新梳理】【附完整代码】
最新版本,点这里 之前一时兴起,写了个生成心形贴图的程序[链接在这里]但是只是把功能实现了,有很多鸡肋还有逻辑之类混乱的,于是又重新整理了一下. 需要用到的库 import os import os. ...
- 估算带卷积核二分类0,3的网络的收敛时间和迭代次数
制作一个网络分类minst的0和3求出这网络的迭代次数曲线表达式n(δ),和准确率表达式p-max(δ),用预期准确率去估算n,并推算需要的时间. 将minst的28*28的图片缩小到9*9,网络用一 ...
最新文章
- python——赋值与深浅拷贝
- C# 文件操作(上传 下载 删除 文件列表...)
- 直播回顾|大规模点云显示技术
- GPT「高仿」问世:GPT-Neo,最大可达GPT-3大小,已开源 | AI日报
- maven 下载 源码和javadoc命令
- Selenium2Lib库之鼠标事件常用关键字实战
- MYSQL连接字符串参数详细解析(大全参考)
- vue 关闭log_vue或react项目生产环境去掉console.log的操作
- 杨威(为奥运冠军名字作诗)
- 屏幕滚动控件Scrollview
- Android中获取手机电量信息
- C++——获取array,vector,string的元素个数
- 在线查找和下载jar包的好工具maven repository
- 大白话讲调度:非支配遗传算法与柔性作业车间调度
- 群晖docker签到京豆_在群晖Docker上的部署qBittorrent
- 探悉 Excel 中不为人所知的技巧
- QSlider功能作用和信号
- WPF 窗口最大化正确方法
- openxml的视频教程
- RedHat 红帽解决YUM源问题