C++高级编程02-函数重载和类的封装

这篇具有很好参考价值的文章主要介绍了C++高级编程02-函数重载和类的封装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、内联函数

2、函数的默认参数和占位参数

4、函数的重载

 5、extern C 浅析

6、封装 


1、内联函数

  1. 内联函数引出---宏缺陷
    1. 宏缺陷:
      1. 必须要加括号保证运算完整
      2. 即使加括号,有些运算依然与预期结果不符
    2. 普通函数不会出现缺陷
  2. C++提供 内联函数代替宏函数
  3. 关键字 inline
  4. 在函数声明和实现中同时加入关键字  inline 才称为内联
  5. 在成员函数前  都隐式加了关键字inline
  6. 有些特殊情况下 ,写了关键字inline也不会按照内联方式处理
    1. 出现循环
    2. 出现判断
    3. 函数体过于庞大
    4. 对函数进行取地址
  7. 总结: 内联函数只是给编译器一个建议,但是编译器不一定接受这个建议,好的编译器会自己给短小的函数前加上关键字inline

代码 

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

//宏缺陷1 : 必须要加括号保证运算完整
#define  MYADD(x,y)  ((x) +(y))
void test01()
{
	int a = 10;
	int b = 20;
	int ret = MYADD(a, b) * 20;
	cout << ret << endl;
}

//宏缺陷2:  即使加了括号,有些运算依然与预期不符

#define MYCOMPARE(a,b)  (((a) < (b)) ? (a) : (b))

//普通函数 不会出现与预期结果不符的问题
void myCompare(int a, int b)
{
	int ret = a < b ? a : b;
	cout << "ret = " << ret << endl;
}

void test02()
{
	int a = 10;
	int b = 20;

	myCompare(++a, b);

	//int ret = MYCOMPARE(++a, b); //预期是 11 结果变为12   (((++a) < (b)) ? (++a) : (b))

	//cout << "ret = " << ret << endl;

}




 

 

2、函数的默认参数和占位参数

函数的默认参数和占位参数

  1. 默认参数
    1. 可以给函数的形参添加默认值
    2. 语法  形参  类型 变量  = 默认值 
    3. int func(int a, int b = 10 , int c = 10)
    4. 注意事项 ,如果有一个位置有了默认参数,那么从这个位置起,从左到右都必须有默认值
    5. 函数的声明和实现 只能有一个 提供默认参数,不可以同时加默认参数
  2. 占位参数
    1. 只写一个类型进行占位,调用时候必须要传入占位值
    2. void func2(int a , int = 1)
    3. 占位参数也可以有默认值

 代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

//默认参数 语法 形参 类型 变量 = 默认值

//优先采用传入的值
int func(int a = 10, int b = 10)
{
	return a + b;
}
void test01()
{
	cout << func() << endl;
}

4、函数的重载

  1. 满足条件
    1. 同一个作用域下
    2. 函数名称相同
    3. 函数参数个数、类型、顺序不同
  2. 函数的返回值  不可以作为重载条件
  3. 注意事项
    1. 加const和不加const的引用可以作为重载条件
    2. 函数重载碰到默认参数  注意避免二义性出现

代码

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

//函数重载条件
//1、在同一个作用域
//2、函数名称相同
//3、参数个数、类型、顺序不同

//class Person
//{
//public:
//	void func()   成员函数 而不是全局函数
//	{
//	}
//};

void func()
{
	cout << "func()调用" << endl;
}

void func(int a)
{
	cout << "func(int a)调用" << endl;
}

void func(double a)
{
	cout << "func(double a)调用" << endl;
}

void func(int a, double b)
{
	cout << "func(int a ,double b)调用" << endl;
}

void func(double a, int b)
{
	cout << "func(double a, int b)调用" << endl;
}

//返回值可不可以作为函数重载的条件 答案:不可以
//int func(int a, double b)
//{
//	cout << "func(int a ,double b)调用" << endl;
//}



void test01()
{
	func(1, 3.14);
}



//函数重载中 引用两个版本
//void myFunc(int a)
//{
//	cout << "myfunc(int a )调用" << endl;
//}
void myFunc(int& a) // int & a  = 10;
{
	cout << "myfunc(int &a )调用" << endl;
}
void myFunc(const int& a) // const int &a = 10;
{
	cout << "myfunc( const int &a )调用" << endl;
}


void test02()
{
	int a = 10;
	//myFunc(a);//需要避免二义性出现

}


//函数重载碰到默认参数  注意避免二义性出现
void func2(int a, int b = 10)
{

}

void func2(int a)
{

}

void test03()
{
	//func2(10); //出现二义性
}


 

 5、extern C 浅析

  1. 用途:在C++中调用C语言文件
  2. C++中有函数重载,会对函数名称做修饰,导致调用C语言的函数链接失败
  3. 利用extern C可以解决问题
    1. 方法1:
      1. 在C++代码中加入
      2. 告诉编译器  show函数用C语言方式 做链接
      3. //extern "C" void show();
    2. 方法2:
      1. 在C语言的头文件中加入6行代码
      2. #ifdef __cplusplus  // 两个下划线  __  c plus plus
      3. extern "C" {
      4. #endif
      5. #ifdef __cplusplus  // 两个下划线  __  c plus plus
      6. }
      7. #endif

代码

#define _CRT_SECURE_NO_WARNINGS 
#include <iostream>
using namespace std;
#include "test.h"
//extern "C" void show();   



void test01()
{
	show();
}
int main()
{
	test01();
	system("pause");
	return EXIT_SUCCESS;
}

C++高级编程02-函数重载和类的封装,c++,开发语言

C++高级编程02-函数重载和类的封装,c++,开发语言 

 

 

6、封装 

  1. C语言的封装
    1. 缺陷 将属性和行为分离
  2. C++语言的封装
    1. 将属性和行为作为一个整体,来表现生活中的事物
    2. 将属性和行为  加以权限控制
  3. 访问权限
    1. 公共权限 public    类内 类外  都可以访问
    2. 私有权限 private   类内可以访问  类外不可以访问
    3. 保护权限 protected类内可以访问  类外不可以访问
  4. class 默认权限  私有权限  而 struct默认权限是 公共权限

代码

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

struct  Person
{
    //公共权限
public:
    char name[64];
    int age;

    void PersonEat()
    {
        printf("%s在吃人饭\n", name);
    }
};

struct Dog
{
    //公共权限
public:
    char name[64];
    int age;

    void DogEat()
    {
        printf("%s在吃狗粮\n", name);
    }
};

//C++封装 理念:  将属性和行为作为一个整体,来表现生活中的事物

//第二次理念: 将属性和行为  加以权限控制

void test01()
{
    struct Person p;
    strcpy(p.name, "老王");

    p.PersonEat();

    //p.DogEat();
}


//struct和class 区别?
//class 默认权限  私有权限  而 struct默认权限是 公共权限
//访问权限
// public  公共权限    成员 类内  类外 都可以访问   
// private 私有权限    成员 类内  可以访问  类外  不可以访问  儿子不可以访问父亲的private权限内容
// protected 保护权限  成员 类内  可以访问  类外  不可以访问  儿子可以访问父亲的protected权限内容

class Person2
{
public:
    string m_Name; //公共权限

protected:
    string m_Car;  //保护权限

private:
    int  m_pwd;  //私有权限

public:

    void func()
    {
        m_Name = "张三";
        m_Car = "拖拉机";
        m_pwd = 123456;
    }

};

void test02()
{
    Person2 p;
    p.m_Name = "李四"; //公共权限  类外可以访问
    //  p.m_Car = "劳斯莱斯"; //保护权限  类外访问不到
    //  p.m_pwd = 123; //私有权限  类外不可以访问
}

 文章来源地址https://www.toymoban.com/news/detail-521308.html

到了这里,关于C++高级编程02-函数重载和类的封装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【C++】:拷贝构造函数与赋值运算符重载的实例应用之日期类的实现

    【C++】:拷贝构造函数与赋值运算符重载的实例应用之日期类的实现

    🔑日期类的实现,将按以下声明依次进行,其中因为Print函数比较短,直接放到类里面让其变成内联函数 🔑而我们实现日期类经常要用到某月有多少天,在这里先把获得某月有多少天的函数实现出来。实现时先检查传参有没有问题,在注意把数组设置成静态的,出了作用域

    2024年02月08日
    浏览(17)
  • 【C++】中类的6个默认成员函数 取地址及const成员函数 && 学习运算符重载 && 【实现一个日期类】

    【C++】中类的6个默认成员函数 取地址及const成员函数 && 学习运算符重载 && 【实现一个日期类】

    1.1 运算符重载【引入】 C++为了增强代码的可读性引入了 运算符重载 ,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。 函数名字为: operator后面接需要重载的运算符符号。 函数原型:

    2024年02月21日
    浏览(18)
  • 【C++漂流记】函数的高级应用——函数默认参数、占位参数、重载

    【C++漂流记】函数的高级应用——函数默认参数、占位参数、重载

    函数的高级应用,侧重介绍函数的默认参数、函数的占位参数、函数重载定义解释及使用。 函数默认参数是指在函数声明时为参数提供一个默认值,这样在调用函数时如果没有传入相应的参数,就会使用默认值代替。函数默认参数可以简化函数的调用,使得函数更加灵活。

    2024年02月09日
    浏览(10)
  • 【C++】STL——list的模拟实现、构造函数、迭代器类的实现、运算符重载、增删查改

    【C++】STL——list的模拟实现、构造函数、迭代器类的实现、运算符重载、增删查改

    list使用文章 析构函数   在定义了一个类模板list时。我们让该类模板包含了一个内部结构体_list_node,用于表示链表的节点。该结构体包含了指向前一个节点和后一个节点的指针以及节点的值。在list中保存了链表的头节点指针和链表长度大小。       因为list的底层实现

    2024年02月14日
    浏览(12)
  • C++核心编程—类和对象,类的三大特性——封装、继承、多态

    C++核心编程—类和对象,类的三大特性——封装、继承、多态

    纵有疾风起,人生不言弃。本文篇幅较长,如有错误请不吝赐教,感谢支持。 ①什么是对象? 生活中有各种各样的 事物 ,如人、动物、植物等在C++中将这些称为对象。 对象多种多样, 各种对象的属性也不相同 。 例如狗的品种,毛色,年龄等 各个对象都有自己的行为 ,例

    2024年02月07日
    浏览(12)
  • C++核心编程——内存分区、引用、函数提高和函数重载

    本专栏记录C++学习过程包括C++基础以及数据结构和算法,其中第一部分计划时间一个月,主要跟着黑马视频教程,学习路线如下, 不定时更新,欢迎关注 。 当前章节处于: ---------第1阶段-C++基础入门 ---------第2阶段实战-通讯录管理系统, ==== 第3阶段-C++核心编程 , --------

    2024年01月22日
    浏览(10)
  • 【C++】类和对象④(类的默认成员函数:取地址及const取地址重载 | 再谈构造函数:初始化列表,隐式类型转换,缺省值)

    【C++】类和对象④(类的默认成员函数:取地址及const取地址重载 | 再谈构造函数:初始化列表,隐式类型转换,缺省值)

    🔥 个人主页: Forcible Bug Maker 🔥 专栏: C++ 目录 前言 取地址及const取地址操作符重载 再谈构造函数 初始化列表 隐式类型转换 explicit 成员变量缺省值 结语 本篇主要内容:类的六个默认成员函数中的 取地址 及 const取地址重载 , 构造函数 初始化列表 , 隐式类型转换

    2024年04月26日
    浏览(14)
  • 【编码狂想】指针航行,链表魔法,解锁结构体和类的编程幻境

    【编码狂想】指针航行,链表魔法,解锁结构体和类的编程幻境

     🌈个人主页: Sarapines Programmer  🔥 系列专栏: 本期文章收录在《C语言闯关笔记》,大家有兴趣可以浏览和关注,后面将会有更多精彩内容!  ⏰翰墨致赠:文墨扬长风,情随碧波舞。江山孕雄心滚滚,志立云霄梦遨游。 ​  🎉欢迎大家关注🔍点赞👍收藏⭐️留言📝

    2024年02月03日
    浏览(9)
  • 运算符重载的函数作为类的成员函数和友元函数

    🐶博主主页: @ᰔᩚ. 一怀明月ꦿ  ❤️‍🔥 专栏系列: 线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++ 🔥 座右铭: “不要等到什么都没有了,才下定决心去做” 🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀 目录 🐰运

    2024年02月08日
    浏览(22)
  • 【C++】实现Date类的各种运算符重载

    【C++】实现Date类的各种运算符重载

    上一篇文章只实现了operator==操作符重载,由于运算符较多,该篇文章单独实现剩余所有的运算符重载。继续以Date类为例,实现运算符重载: 1.Date.h Date.cpp 3.Test.cpp

    2024年02月20日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包