并非从0开始的c++ day14

  • 函数的默认参数
    • 函数的默认参数的注意事项
  • 占位参数
    • 占位参数和默认参数混搭
  • 函数参数传递的三种方式
    • 值传递
    • 指针传递
    • 引用传递
  • 函数重载
    • 函数重载的条件
    • 调用重载函数的注意
    • 函数重载和函数默认参数一起使用,需要注意二义性
    • 函数的返回值不作为函数的重载的条件
    • 函数重载的原理
  • C++调用C语言的函数
  • 类和对象的概念
    • 类的封装
      • 为什么要有封装
      • 类的权限
    • 尽量把属性设置为私有权限
    • C++中类和结构体的区别

函数的默认参数

  1. 函数的默认参数就是给函数的形参赋值
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;
}

函数的默认参数的注意事项

  1. 函数的默认参数后面的参数必须都是默认参数
//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;
}
  1. 函数的声明和实现不能同时有函数的默认参数
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语言的方式去寻找

类和对象的概念

  1. 类是自定义数据类型,是C语言的结构体进化而成的
  2. 对象是类实例化出的,用数据类型定义一个变量

类的封装

  1. 封装是吧属性(变量)和方法(函数)封装到类内,然后给这些数据赋予权限

为什么要有封装

  1. 防止乱调用函数和变量,出现错误
  2. 维护代码更方便

类的权限


子类的类内可以访问父类的保护权限的成员

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();
}

尽量把属性设置为私有权限

  1. 可以控制属性的读写权限
  2. 可赋予客户端访问数据的一致性
  3. 可以保护属性的合法性
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相关推荐

  1. 并非从0开始的c++之旅 day1

    并非从0开始的c++之旅 day1 前言 一.部分c语言基础知识回顾 二.typedef的使用 1.typedef 可以在结构体在被调用时简化struct关键字 2.typedef 可以区分数据类型 ...

  2. 并非从0开始的c++ day15

    并非从0开始的c++ day15 点和圆的关系 案例 要求 点的类 圆的类 全局 构造函数与析构函数 构造函数与析构函数的作用 构造函数和析构函数的运行 有参构造和无参构造函数 构造函数和析构函数的注 ...

  3. 并非从0开始的c++ day9

    并非从0开始的c++ day9 配置文件读写练习 需求 判断文件有效行数 根据字符串判断是否是有效行 文件解析 根据key获取value的值 释放内存 文件加密 加密 解密 函数指针 函数指针基本介绍 ...

  4. 并非从0开始的c++ day13

    并非从0开始的c++ day13 引用 引用基本用法 引用注意事项 数组的引用 引用的本质 const 和#define 区别总结 指针的引用 C和C++的区别 引用的使用场景 常量的引用 bool类 ...

  5. 并非从0开始的c++ day10

    并非从0开始的c++ day10 实现对任意类型数组的排序 预处理 文件包含指令(#include) 文件包含处理 #include<>和#include''区别 宏定义 无参数的宏定义( ...

  6. 并非从0开始的c++ day12

    并非从0开始的c++ day12 C++概述 第一个C++程序 面向对象三大特性 封装 继承 多态 名字控制 C++命名空间 命名空间的注意事项 作用域运算符 using using声明 using编 ...

  7. 并非从0开始的c++ day6

    并非从0开始的c++ day6 二级指针练习-文件读写 位运算 位逻辑运算符 按位取反 ~ 位于(AND):& 位或(OR): | 位异或: ^ 移位运算符 左移<< 右移> ...

  8. Python 拼图成心2.0【重新梳理】【附完整代码】

    最新版本,点这里 之前一时兴起,写了个生成心形贴图的程序[链接在这里]但是只是把功能实现了,有很多鸡肋还有逻辑之类混乱的,于是又重新整理了一下. 需要用到的库 import os import os. ...

  9. 估算带卷积核二分类0,3的网络的收敛时间和迭代次数

    制作一个网络分类minst的0和3求出这网络的迭代次数曲线表达式n(δ),和准确率表达式p-max(δ),用预期准确率去估算n,并推算需要的时间. 将minst的28*28的图片缩小到9*9,网络用一 ...

最新文章

  1. python——赋值与深浅拷贝
  2. C# 文件操作(上传 下载 删除 文件列表...)
  3. 直播回顾|大规模点云显示技术
  4. GPT「高仿」问世:GPT-Neo,最大可达GPT-3大小,已开源 | AI日报
  5. maven 下载 源码和javadoc命令
  6. Selenium2Lib库之鼠标事件常用关键字实战
  7. MYSQL连接字符串参数详细解析(大全参考)
  8. vue 关闭log_vue或react项目生产环境去掉console.log的操作
  9. 杨威(为奥运冠军名字作诗)
  10. 屏幕滚动控件Scrollview
  11. Android中获取手机电量信息
  12. C++——获取array,vector,string的元素个数
  13. 在线查找和下载jar包的好工具maven repository
  14. 大白话讲调度:非支配遗传算法与柔性作业车间调度
  15. 群晖docker签到京豆_在群晖Docker上的部署qBittorrent
  16. 探悉 Excel 中不为人所知的技巧
  17. QSlider功能作用和信号
  18. WPF 窗口最大化正确方法
  19. openxml的视频教程
  20. RedHat 红帽解决YUM源问题

热门文章

  1. Oracle数据库中复制表数据
  2. 有了那么多的工业软件,为何还需要工业互联网?
  3. ss一键搭建php,宝塔面板开发全自动ssrpanel一键脚本 | 刺客博客 - 刺客博客
  4. HTML span元素
  5. 简单理解Socket 协议
  6. Qt中exec函数的作用
  7. 简单两招教会您,电脑怎么录屏
  8. IP175G交换机原理图
  9. 想开水果店从哪里进货渠道,水果店的进货渠道
  10. pyecharts库介绍