文章目录

    • 求圆的周长和面积
    • 易犯错误模型
  • C++对C的扩展
    • 1. namespace 和 iostream
    • 2. 实用性增强
    • 3. register关键字增强
    • 4. 新增bool类型关键字
    • 5.三目运算符增强
  • const
    • const 和 define
  • 引用的基础知识
    • 变量名:
    • 引用的概念
    • 复杂数据类型引用做函数参数
    • 引用的本质
    • 函数返回值是一个引用

求圆的周长和面积

//求圆的周长面积
//1.面向过程
#include<iostream>
using namespace std;int main()
{double r = 0;double pi = 3.14;cout << "Please enter r :" << endl;cin >> r;double c = 0, s = 0;c = 2 * pi * r;s = pi * r * r;cout << "周长是:" << c << endl<< "面积是:" << s << endl;
}


//面向对象#include <iostream>
using namespace std;//定义一个circle类 类的抽象
class circle {private:double radius = 0;//定义成员变量 / 属性double pi = 3.14;
public:void Set_radius(double r)//定义成员函数{radius = r;}double Get_radius(){return radius;}double Grith()return  2 * pi * radius;}double Area(){return pi * radius * radius;}
};//实例化
int main()
{circle A, B;//类创建对象A.Set_radius(2);//对象调用类的成员函数B.Set_radius(3);cout << "圆A的周长是:" << A.Grith() << endl;cout << "圆A的面积是:" << A.Area() << endl;cout << "圆B的周长是:" << B.Grith() << endl;cout << "圆B的面积是:" << B.Area() << endl;
}

易犯错误模型

//易错模型 没有成员函数#include<iostream>
using namespace std;class circle
{//只有成员变量,没有成员函数
public:double r ;double pi = 3.14;double area = pi * r * r;
};int main()
{circle c1;cout << "Please enter your r:" << endl;cin >> c1.r;cout << c1.area << endl;//没有执行pi * r * r 只是从变量area取值return 0;
}


因为初始化的时候r是一个随机值,造成area的值是一个乱码

添加成员函数

//易错模型 没有成员函数#include<iostream>
using namespace std;class circle
{//只有成员变量,没有成员函数
public:double r ;double pi = 3.14;double area = pi * r * r;//添加成员函数double getArea(){area = pi * r * r;return area;}};int main()
{circle c1;cout << "Please enter your r:" << endl;cin >> c1.r;//函数调用c1.getArea();//没有执行pi * r * r 只是从变量area取值//在类型定义的时候 area 里面就已经有了一个大的垃圾值cout << c1.area << endl;return 0;
}

C++对C的扩展

1. namespace 和 iostream

#include<iostream>
using namespace std;
//命名空间的定义
namespace namespaceA
{int a = 10;
}namespace namespaceB
{int a = 30;//命名空间的嵌套namespace namespaceC{struct Teacher{char name;int age;};}
}int main()
{//命名空间的使用cout << namespaceA::a << endl;cout << namespaceB::a << endl;namespaceB::namespaceC::Teacher t;t.age = 40;//using namespaceB::namespaceC::Teacher;//Teacher t;//t.age = 40;cout << t.age << endl;
}

c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。

2. 实用性增强

C语言中的变量都必须在作用域开始的位置定义!!
C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义。

3. register关键字增强

register关键字 请求编译器让变量a直接放在寄存器里面,速度快

在c语言中 register修饰的变量 不能取地址
在C++中依然支持register关键字
C++编译器有自己的优化方式,不使用register也可能做优化
C++中可以取得register变量的地址

4. 新增bool类型关键字

#include<iostream>
using namespace std;int main()
{//占用内存空间//告诉编译器分配一个字节的内存空间cout << "sizeof(bool)" << sizeof(bool) << endl;//bool变量只能为 1 或 0;bool b0 = 0;bool b1 = 10;bool b2 = -10;bool b3 = true;bool b4 = false;cout << "b0 : " << b0 << endl;cout << "b1 : " << b1 << endl;cout << "b2 : " << b2 << endl;cout << "b3 : " << b3 << endl;cout << "b4 : " << b4 << endl;return 0;
}

5.三目运算符增强

C中 返回的是变量的值 ,不能做左值(当左值的条件: 有一定的内存空间)
C++ 中返回的是变量的本身,可以做指针

#include<iostream>
using namespace std;int main()
{int a = 10;int b = 20;//(a > b ? a : b)返回的是变量的本身//a < b  把30赋值给b //如何在C中完成C++中的操作//返回内存空间 内存首地址 指针//*(a > b ? &a : &b) = 30;(a > b ? a : b) = 30;cout << "a: " <<a << endl;cout << "b: " <<b << endl;return 0;}

const

const 修饰的是指针变量本身 还是 指针所修饰的内存空间

const是定义常量,表示只能只读

#include<iostream>
using namespace std;struct Teacher
{char name;int age;
};//指针所指向的内存空间不能被修改
int operatorTeacher01(const Teacher* pt)
{//pt.age = 10;return 0;
}//指针变量不能被修改,指针所指向的内存空间可以被修改
int operatorTeacher02(Teacher* const pt)
{pt->age = 10;//pt = NULL;return 0;
}
int operatorTeacher03(const Teacher* const pt)
{//pt->age = 10;//pt = NULL;cout << pt->age << endl;return 0;
}int main()
{Teacher t;t.age = 20;operatorTeacher03(&t);cout << "hello" << endl;}

C语言中的const是冒牌货 可以通过指针来修改

#include <iostream>
using namespace std;int main()
{int *p = NULL;int const a = 10;//int a = 10;p = (int*) &a;*p = 20;cout << a << endl;}

C语言中的const变量
C语言中const变量是只读变量,有自己的存储空间
C++中的const常量
可能分配存储空间,也可能不分配存储空间
当const常量为全局,并且需要在其它文件中使用
当使用&操作符取const常量的地址

const 和 define

void fun1()
{#define a 10;int const b = 10;
}void fun2()
{cout << a;//cout << b << endl;
}int main()
{fun1();fun2();return 0;
}

const常量是由编译器处理的,提供类型检查和作用域检查
宏定义由预处理器处理,单纯的文本替换

引用的基础知识

变量名:

  • 实质上是一段连续的内存空间的别名,是一个门牌号
  • 程序通过变量来申请并命名内存空间
  • 通过变量的名字可以使用存储空间
  • 普通引用必须要初始化
  • 引用做函数形参不需要初始化

引用的概念

a. 在C++中新增了引用的概念
b. 引用可以看作是一个已定义变量的别名
c. 语法:Type& name = var;

#include<iostream>
using namespace std;int main()
{int a = 19;int& b = a;//int& c; //引用必须要初始化b = 20;//相当于把a 改成20cout << " a:" << a << endl;cout << " m:" << b << endl;a = 30;//相当于把b也改成30  a 就是b  b 就是  a;cout << " a:" << a << endl;cout << " m:" << b << endl;return 0;}


//交换

引用的意义:
1)引用作为其它变量的别名而存在,因此在一些场合可以代替指针
2)引用相对于指针来说具有更好的可读性和实用性

#include<iostream>
using namespace std;void swap01(int a, int b)
{int t;t = a;a = b;b = t;
}void swap02(int* a, int* b)
{int t;t = *a;*a = *b;*b = t;
}//a就是x的别名, b就是y的别名
//引用做函数形参不需要初始化
void swap03(int& a, int& b)
{int t;t = a;a = b;b = t;
}int main()
{int x = 10;int y = 20;swap01(x ,y);cout << "x :" << x << endl<< "y :" << y << endl;cout << endl;swap02(&x, &y);cout << "x :" << x << endl<< "y :" << y << endl;cout << endl;swap03(x, y);cout << "x :" << x << endl<< "y :" << y << endl;return 0;
}

复杂数据类型引用做函数参数

//复杂数据类型引用做函数参数
#include<iostream>
using namespace std;struct Teacher
{char name;int age;
};void printT01(Teacher *tP)
{cout << tP->age << endl;
}
//tP是t 的别名 ,这里修改 t 的值也会改变
void printT02(Teacher& tP)
{tP.age = 40;//cout << tP.age << endl;}
//tP和t是两个不同的变量
void printT03(Teacher tP)
{tP.age = 45;//cout << tP.age << endl;//在这里修改tP不会修改t的值}int main()
{Teacher t;t.age = 30;printT01(&t);printT03(t); //tP是形参 相当于copy一份t的数据给tP  ----》 tP  = tcout << "t.age:" << t.age << endl;printT02(t); //tP是t的别名cout << "t.age:" << t.age << endl;

引用的本质

void modify01(int& a1)
{a1 = 5;
}void modify02(int* const a1)
{*a1 = 15;
}
int main()
{int a = 10;modify01(a);//函数的引用不需要我们分配内存空间cout << a << endl;int b = 20;modify02(&b);//如果是指针 需要手动的去取实参的地址cout << b << endl;
}

间接赋值成立的三个条件

  1. 定义两个变量 (一个实参一个形参)
  2. 建立关联 实参取地址传给形参
  3. *p形参去间接的修改实参的值
void  modify(int* p)//*p间接修改实参值
{*p = 100;
}int main()
{int a = 10;int* p = NULL;//定义两个变量 一个实参一个形参//p = &a;modify(&a);//建立关联 把实参的地址传递给形参cout << a << endl;
}

引用在实现上,只不过是把:间接赋值成立的三个条件的后两步和二为一
//当实参传给形参引用的时候,只不过是c++编译器帮我们程序员手工取了一个实参地址,传给了形参引用(常量指针)

函数返回值是一个引用

当函数返回值为引用时
若返回栈变量
不能成为其它引用的初始值
不能作为左值使用

#include<iostream>
using namespace std;int fun1()
{int a1 = 10;return a1;
}
int& fun2()
{int a2 = 20;return a2;
}int main()
{int a = 0;a = fun1();cout << a << endl;a = fun2();cout << a << endl;//int& a = fun2();//若返回栈变量不能做其他引用的初始值//cout << a << endl;cout << "hello" << endl;return 0;
}

若返回静态变量或全局变量
可以成为其他引用的初始值
即可作为右值使用,也可作为左值使用

#include<iostream>
using namespace std;
//返回变量的值
int fun1()
{static int a1 = 10;return a1;
}
//返回变量本身
int& fun2()
{static int a2 = 20;return a2;
}int main()
{int a = 0;int b = 0;a = fun1();cout << a << endl;b = fun2();cout << b << endl;int& c = fun2();cout << c << endl;return 0;
}

#include<iostream>
using namespace std;
//返回变量的值
int fun1()
{static int a1 = 10;return a1;
}
//返回变量的本身
int& fun2()
{static int a2 = 20;a2++;cout << a2;return a2;
}int main()
{fun2() = 100;//函数返回值是一个引用,并且当左值cout << endl;fun2();cout << endl;int c = fun2();// 函数返回值当右值return 0;
}

30天学习C++从入门到入土 --- Day01相关推荐

  1. 30天学习C++从入门到入土 --- Day03

    文章目录 类和对象 基本概念 类的封装 1. 把属性和方法进行封装 2. 对属性和方法进行控制 3.没有访问控制限定的成员变量 函数 默认是私有属性 4. 类的内部和类的外部 5. class 和 s ...

  2. Java学习指南从入门到入土

    Java学习指南从入门到入土 本身其实只是刚刚入门,只是经历了两年时间的风吹雨打,经历了各种bug的折磨和学习各种框架的辛酸,才有得现有的 刚刚入门.有句老话说的好叫做 从入门到放弃,人生不易要及时放 ...

  3. Java学习路线从入门到入土

    Java学习路线从入门到入土 Java学习路线从入门到入土 Java学习路线从入门到入土 简介 Java基础课程 第一阶段 第一部分:Java开发介绍 第二部分:Java数组 第三部分:Java面向对 ...

  4. python学习路线--从入门到入土

    入门技术博客 进阶自己挑选 入门基础 Python入门相对容易又可以干很多事(网站,运维,数据,爬虫等),是一门方便的工具语言.2016年TIOBE排名显示Python已经名列第四,成为脚本语言之首. ...

  5. Vue学习之从入门到入土

    el用于指定当前Vue实例为哪个容器服务,值通常为css选择器字符串 data中用于存储数据,数据供el所指定的容器去使用 插值语法:{{xxx}} 适用于标签体内 xxx可以直接接受到data中的所 ...

  6. Redis入门到入土(day01)

    NoSQL概述 为什么用NoSQL 1.单机MySQL的美好年代 在90年代,一个网站的访问量一般不大,用单个数据库完全可以轻松应付! 在那个时候,更多的都是静态网页,动态交互类型的网站不多. 上述架 ...

  7. openCV4.0 C++ 快速入门30讲学习笔记(自用 代码+注释)详细版

    课程来源:哔哩哔哩 环境:OpenCV4.5.1 + VS2019 目录 002.图像色彩空间转换 003.图像对象的创建与赋值 004.图像像素的读写操作 005.图像像素的算术操作(加减乘除4种不 ...

  8. 从入门到入土:Python爬虫学习|Selenium自动化模块学习|简单入门|轻松上手|自动操作浏览器进行处理|chrome|PART01

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  9. 【Java学习从入门到入土,手把手吧基础知识填充进你的大脑】

    [JAVA简介] Java已经多年连续占据编程语言的榜首,Java是一门面向对象编程语言,它不仅吸收了C++语言的各种优点,还摒弃了C++语言中难以理解的多继承.指针等概念,因此Java语言具有功能强 ...

最新文章

  1. 文件上传利器SWFUpload使用指南
  2. Apple高规格推3232吋LCD面板XDR
  3. 计算同比 环比_PowerBI学习教程(三)时间累积同比环比计算
  4. 翻动100万级的数据
  5. 【实施工程师之家】linux安装mysql(yum安装mysql)
  6. 复旦大学吴立德《数值优化》、《深度学习》和
  7. OpenJudge/Poj 1915 Knight Moves
  8. colab文件夹上传到github
  9. 为什么我花了三个半月准备的面试还是砸了?附 iOS 开发者求职攻略
  10. Eclipse中【Maven下载时,下载源码】设定方法
  11. 构建之法阅读笔记(二)
  12. 教你如何理解Vue中的nextTick
  13. 特殊的栈GetMin
  14. java中两个源文件_两个java源文件同属一个包,其中一个类引用了另一个,在用javac编译时,报错找不到引用的类,import无作用...
  15. python矩阵计算器心得_矩阵类计算器Python
  16. transitive fanout与set_dont_touch_network
  17. 可以把JPG图片转成PDF的格式转换器
  18. easyexcel注解样式无效_easyexcel注解
  19. 2020北航计算机夏令营
  20. 用户情绪:愉悦和不爽

热门文章

  1. 语音聊天室源码中的变声,应用了哪些算法?
  2. CCNP知识点总结——BGP
  3. 中文字体在 CSS 中的写法
  4. 【可解释】|ISCAM
  5. odoo 如何解决 由于附件过多 备份超时的现象
  6. Redis_18_Redis客户端-服务端架构
  7. Google 源码中电池百分比获取方法和格式转换
  8. N2N安卓版随时随地用和手机访问你的电脑NAS 等设备
  9. 单片机超轻量级操作系统
  10. python win32com 操作wps Excel pywintypes.com_error: (-2147221005, '无效的类字符串', None, None) 解决办法