Day28.C++02

001.作业案例_设计圆类求周长

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;const double pi = 3.14;//1.设计一个类,求圆的周长
//周长公式 2 * pi * r
class Circle//class 代表声明一个类,后面紧跟的是类的名称
{public://公共权限//求圆的周长//在类里面写函数  成员函数double caculateZC(){return 2 * pi * m_R;}//设置半径的成员方法//成员函数 可以修改成员属性void setR(int r){m_R = r;}//半径 成员属性int m_R;
};void test01()
{//通过类 来创建一个圆Circle c1;//圆 对象//c1.m_R = 10;//给这个对象来进行半径的赋值//通过成员函数 间接给圆设置半径c1.setR(10);//输出c1的周长cout << "c1的周长为:" << c1.caculateZC() << endl;
}int main(void)
{test01();system("pause");return EXIT_SUCCESS;
}

002.作业案例_设计学生类

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;
/*
2.设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示学生的姓名和学号
*/class Student
{public://公共权限string m_Name;int m_Id = NULL;void setName(string name){m_Name = name;}void setId(int id){m_Id = id;}void showInfo(){cout << "姓名:" << m_Name << "  " << "学号为:" << m_Id << endl;}};void test01()
{//创建一个学生,实例化——通过类来创建对象的过程Student st;st.setName("刘备");st.setId(2020666);st.showInfo();
}int main(void)
{test01();system("pause");return EXIT_SUCCESS;
}

003.内联函数的引出-宏函数的缺陷

简单总结:

//1.内联函数注意事项
inline void func();//内联函数声明
inline void func() {};//如果函数实现的时候,没有加inline关键字,那么这个函数依然不算内联函数
//类内部的成员函数 默认前面会加inline关键字/*
内联编译会有一些限制,以下情况编译器可能考虑不会将函数进行内敛编译:
1.不能存在任何形式的循环语句
2.不能存在过多的条件判断语句
3.函数体不能过于庞大
4.不能对函数进行取址操作
*/
//内敛仅仅只是给编译器的一个建议,编译器不一定接受这种建议。
//如果你没有将函数声明为内联函数,那么编译器也可能将此函数做内联编译。
//一个好的编译器将会内联小的简单的函数。

代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;//定义一个加法
#define myAdd(x,y) x+y//缺陷1
void test01()
{int ret = myAdd(10, 20) * 20;//预期结果600,实际结果410     解决方法:加小括号 ((x) + (y))cout << "ret = " << ret << endl;
}#define myCompare(a,b) ((a) < (b)) ? (a) : (b)//缺陷2
void test02()
{int a = 10;int b = 20;int ret = myCompare(++a, b);//预期结果:11  实际结果:12cout << "ret = " << ret << endl;
}
//缺陷3:宏函数也没有作用域//内联函数
inline void myCompare_1(int a, int b)
{int ret = a < b ? a : b;cout << "ret = " << ret << endl;
}
//1.内联函数注意事项
inline void func();//内联函数声明
inline void func() {};//如果函数实现的时候,没有加inline关键字,那么这个函数依然不算内联函数
//类内部的成员函数 默认前面会加inline关键字/*
内联编译会有一些限制,以下情况编译器可能考虑不会将函数进行内敛编译:
1.不能存在任何形式的循环语句
2.不能存在过多的条件判断语句
3.函数体不能过于庞大
4.不能对函数进行取址操作
*/
//内敛仅仅只是给编译器的一个建议,编译器不一定接受这种建议。
//如果你没有将函数声明为内联函数,那么编译器也可能将此函数做内联编译。
//一个好的编译器将会内联小的简单的函数。void test03()
{int a = 10;int b = 20;myCompare_1(++a, b);
}int main(void)
{//test01();//test02();test03();system("pause");return EXIT_SUCCESS;
}

004.函数默认参数以及占位参数

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;//函数的默认参数 参数后面 = ···
//函数参数的注意事项,如果有一个位置有了默认参数,那么从这个位置开始,从左往右都必须有默认参数
//传入参数时,如果有传入参数,就用传入的参数;如果没有传入的参数,就用默认值//如果函数声明里面有了 默认参数,那么函数实现的时候必须没有(否则会报重定义)
//函数声明和实现里,只能有一个里面有默认参数,不要同时都出现默认参数
void myFunc(int a = 10, int b = 10);
void myFunc(int a, int b) {}void func(int a,int b = 10,int c = 1)
{cout << "a + b + c = " << a + b + c << endl;
}void test01()
{//func();func(1,2);
}//函数,占位参数
//如果有了占位参数,函数调用的时候必须要提供这个参数,但是用不到
//占位参数,没啥大用,只有后面重载 ++符号才有一点点用
//占位参数 可以有默认值
void func_2(int a,int = 1)
{}void test02()
{func_2(10, 1);
}//C语言中没有默认参数和占位参数int main(void)
{test01();system("pause");return EXIT_SUCCESS;
}

005.函数重载的基本语法

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;//函数重载
//C++中 函数名可以重复
//必须在同一个作用域,函数名称相同
//函数的参数个数不同,或者类型不同,或者顺序不同
void func()
{cout << "无参数的func()" << endl;
}void func(int a)
{cout << "有参数的func(int a)" << endl;
}
//返回值可以作为函数重载的依据吗?? 不可以!void test01()
{func(1);
}//当函数重载 碰到了 默认参数的时候,要注意避免二义性的问题
void func02(int a, int b = 10)
{}
void func02(int a)
{}void test02()
{//func02(10);
}//引用的重载版本
void func03(int& a)//引用必须要引合法的内存空间
{cout << "int& a" << endl;
}void func03(const int& a)//const 也是可以作为重载的条件
{cout << "const int& a" << endl;
}
void test03()
{int a = 20;func03(a);func03(10);
}int main(void)
{test01();system("pause");return EXIT_SUCCESS;
}

006.extern C浅析

extern C浅析.cpp

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include"test.h"//C++中想调用C语言方法
//extern "C" void show();//show方法按照C语言方式做连接int main(void)
{show();//在C++中,函数是可以发生重载的,编译器会把这个函数名称偷偷改变 _showv()system("pause");return EXIT_SUCCESS;
}

test.h

#pragma once#ifdef __cplusplus//两个下划线
extern "C" {#endif#include<stdio.h>void show();#ifdef __cplusplus//两个下划线
}
#endif

test.c

#include"test.h"void show()
{printf("hello world!\n");
}

007.C语言下封装和C++封装的区别

C语言下的封装:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>struct Person
{char mName[64];int mAge;
};struct Dog
{char mName[64];int mAge;
};void personEat(struct Person* p)
{printf("%s吃中餐\n", p->mName);
}
void dogEat(struct Dog* d)
{printf("%s吃狗粮\n", d->mName);
}void test01()
{struct Person p1;strcpy(p1.mName, "老王");struct Dog d1;strcpy(d1.mName, "旺财");dogEat(&p1);dogEat(&d1);
}//C语言封装 属性和行为分开处理了;再加上类型检测不够
//所以就会出现“老王吃狗粮”的结果
int main(void)
{test01();system("pause");return EXIT_SUCCESS;
}

C++语言的封装:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;struct Person
{char mName[64];int mAge;void personEat(){cout << mName << "吃中餐" << endl;}
};struct Dog
{char mName[64];int mAge;void dogEat(){cout << mName << "吃狗粮" << endl;}
};//C++中的封装 严格类型转换检测,让属性和行为绑定到一起
//属性和行为作为一个整体来表示生活中的事物
//控制权限:public 公共权限  protected 保护权限  private 私有权限
void test01()
{Person p1;strcpy(p1.mName, "老王");p1.personEat();//p1.dogEat();
}//struct和class是一个意思,唯一的不同就是默认权限;struct是public,但是class是private
class Animal
{private://如果不声明权限,默认权限是privatevoid animalEat() {}void setAge(int age){mAge = age;}int mAge;public:int mHeight;protected://保护权限,类内部可以访问,(当前类的子类可以访问),类外部不可以访问int mWeight;void setWeight(int weight){mWeight = weight;}
};//所谓私有权限,就是私有成员(属性、函数)在类内部可以访问,类外部不可以访问
//公共权限,在类内部和类外部都可以访问
void test02()
{Animal an;//an.animalEat();//私有权限an.mHeight = 100;//共有权限在类外部可以访问到//an.mWeight = 100;//保护权限
}/*
public    类内,类外 都可以访问
protected 类内可以访问 类外不可以访问(子类可以访问)
private   类内可以访问 类外不可以访问
*/int main(void)
{test01();system("pause");return EXIT_SUCCESS;
}

008.建议将成员变量设置为private

建议将成员变量设置为私有,对外提供公共的set和get方法来操作变量。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;class Person
{public:void setName(string name){m_Name = name;}string getName(){return m_Name;}void setAge(int age){if (age < 0 || age>130){cout << "你个老妖精" << endl;return;}m_Age = age;}int getAge(){return m_Age;}void setLover(string lover){m_Lover = lover;}private:string m_Name;//姓名,读写int m_Age = 1;//年龄,读写string m_Lover;//爱的人,只写};void test01()
{Person p1;p1.setAge(18);p1.setName("徐哥哥");p1.setLover("小马");cout << p1.getName() << "的年龄为:" << p1.getAge() << "岁" << endl;
}int main(void)
{test01();system("pause");return EXIT_SUCCESS;
}

Day28.C++02相关推荐

  1. python全栈工程师完整版视频教程

    来源: 来自网络,如侵权请告知博主删除????. 仅学习使用,请勿用于其他-  今天给大家分享一套Python全栈学习的视频,从目录可以看出真的太全面了~ day01-python 全栈开发-基础篇 ...

  2. DAY28:Linux、Windows 系统提权

    DAY28:Linux.Windows 系统提权 1.Linux 系统提权 1.1.Linux 系统版本 linux发行版本: • centos • redhat • ubuntu • kali 1. ...

  3. 零起点学算法02——输出简单的句子

    零起点学算法02--输出简单的句子 Description 会输出Hello World!了,那换个句子也会吧? Input 没有输入 Output 现在要求你输出下面红色的字  Nice to me ...

  4. [转载] 杜拉拉升职记——02 单相思与性骚扰

    来源:李可. 杜拉拉升职记(第三版). 西安: 陕西师范大学出版社, 2010, 5. 02  单相思与性骚扰的区别 拉拉注意到,DB所有经理办公室沿走道的这一面,都是用大块的玻璃来做间隔墙. 拉拉问 ...

  5. tesseract-ocr3.02字符识别过程操作步骤

    1.  从http://code.google.com/p/tesseract-ocr/downloads/list下载tesseract-ocr-3.02-vs2008.tesseract-ocr- ...

  6. 指针02 - 零基础入门学习C语言42

    第八章:指针02 让编程改变世界 Change the world by program 对"&"和"*"运算符再做些说明 如果已执行了语句 point ...

  7. 【青少年编程竞赛交流】02月份微信图文索引

    02月份微信图文索引 由于"组队学习"这个公众号的功能主要是组织Datawhale社群中的学习者们每个月的组队学习,所以,我另外新建了这个微信公众号"青少年编程竞赛交流& ...

  8. 深入浅出Pytorch:02 PyTorch基础知识

    深入浅出Pytorch 02 PyTorch基础知识 内容属性:深度学习(实践)专题 航路开辟者:李嘉骐.牛志康.刘洋.陈安东 领航员:叶志雄 航海士:李嘉骐.牛志康.刘洋.陈安东 开源内容:http ...

  9. 第02章 PyTorch基础知识

    文章目录 第02章 Pytorch基础知识 2.1 张量 2.2 自动求导 2.3 并行计算简介 2.3.1 为什么要做并行计算 2.3.2 CUDA是个啥 2.3.3 做并行的方法 补充:通过股票数 ...

最新文章

  1. HarmonyOS开发工具DevEcoStudio 的下载以及运行(包含下载开发工具,sdk,模拟机,以及运行第一个应用你好,世界)
  2. html css鼠标手型效果
  3. bootstraptable控制分页_bootstrap-table后端分页功能完整实例
  4. 掌握ES6/ES2015核心内容
  5. autowired用在static_java – @Autowired和static方法
  6. 计算机专业带给我们的启示,一次电脑网络调查带给我的启示
  7. Linux服务器性能评估(转)
  8. mysql排序之order by
  9. 演示Go语言多返回值功能
  10. PMP试题 | 每日一练
  11. C语言面试题 - 结构体对齐
  12. jQuery固定侧边栏插件ss-Menu.js
  13. png转icon java,PNG转ICO - steambap的个人空间 - OSCHINA - 中文开源技术交流社区
  14. 什么是自然语言理解?自然语言理解的准则是什么?
  15. python format( )强力格式化
  16. 解决pdf.js下载PDF文件名称中文乱码和不带.pdf后缀名问题
  17. bellman算法流程
  18. perf part II
  19. 前端实现轮播图的三种方法。
  20. 光纤交换机 序列号_交换机 获取S系列交换机序列号

热门文章

  1. 想要学好云计算,这四个方法要掌握!
  2. python日本 老龄化分析_即将读研,求问前辈有什么研究生安利的软件 APP 或者阅读文献用的等一系列提高效率的东西吗!?...
  3. 教你一键采集天猫商品主图视频的方法及步骤
  4. 解决Retrying connect to server: 192.168.x.x:8032. Already tried 0 time(s); retry policy is...
  5. 【PR #2】史莱姆(值域分段)
  6. 数字化转型中基于交付价值数据治理的6大原则
  7. java数字图像处理开题报告,基于MATLAB的数字图像处理算法研究与仿真开题报告...
  8. java实现收藏功能
  9. Navigation网站收藏和导航平台
  10. 工行山东省分行加强客户信息安全保护