c++初识

cout在std命名空间下

换行endl;

system("pause");//阻塞
return EXIT_SUCCESS;返回正常退出
#define _CRT_SECURE_NO_WARNINGS
//当使用老的不安全函数仍然能编译通过

面向对象三大特性:封装、继承、多态

双冒号作用域运算符

::代表作用域 如果前面什么都不添加 代表全局作用域

cout<<"atk="<<atk<<std::endl;
//atk为局部变量,endl为std作用域下的变量
cout<<"全局atk="<<::atk<<std::endl;
//atk为全局变量。

namespace命名空间

为了避免二义性,解决名称冲突,会在头文件里将同名函数定义到命名空间下即可。

//game1.h内部分代码
···
namespace KingGlory
{void goAtk();
}
···
//game2.h内部分代码
···
namespace LOL
{void goAtk();
}
···
//game1.cpp内部分代码
#include"game1.h"
#include"game2.h"
···
void KingGlory::goAtk()
{cout << "王者荣耀攻击实现" << endl;
}
void  LOL::goAtk()
{cout << "LOL攻击实现" << endl;}

命名空间下可以存放 : 变量、函数、结构体、类…

命名空间必须要声明在全局作用域
不可以在函数体内使用命名空间

命名空间可以嵌套命名空间

···
namespace B
{int m_A = 10;namespace C{int m_A = 20;}
}
void test03()
{cout << "B空间下的m_A = " << B::m_A << endl;cout << "C空间下的m_A = " << B::C::m_A << endl;
}
···

命名空间是开放的,可以随时将新成员添加到命名空间下
再声明命名空间,作用是合并而不是覆盖。

命名空间可以匿名的
匿名命名空间是全局的,相当于是声明了静态变量。

namespace
{int m_C = 1000;int m_D = 2000; //当写的命名空间的匿名的,相当于写了  static int m_C = 1000; static int m_D = 2000;
}void test05()
{cout << "m_C = " << m_C   << endl;cout << "m_D = " << ::m_D << endl;
}

命名空间可以起别名

namespace veryLongName
{int m_E = 10000;
}
void test06()
{namespace veryShortName = veryLongName;cout << veryShortName::m_E << endl;cout << veryLongName::m_E << endl;//两个名都可以找到命名空间的变量
}

using声明

void test01()
{int sunwukongId = 2;//1、using声明//using KingGlory::sunwukongId ;  //当using声明与 就近原则同时出现,出错,尽量避免//就近原则:先选择调用函数体内的,再选择调用函数体外的cout << sunwukongId << endl;}

using编译指令

void test02()
{//int sunwukongId = 2;//2、using编译指令using namespace KingGlory;using namespace LOL;//当using编译指令  与  就近原则同时出现,优先使用就近//当using编译指令有多个,需要加作用域 区分cout << KingGlory::sunwukongId << endl;cout << LOL::sunwukongId << endl;
}

C++对C语言的增强和拓展

1、全局变量监测增强

int a;
int a = 10;//c++中会报错重复定义

C++检测出重定义,而C监测不出来。

2、函数监测增强

getRectS( w  , h)//c中不会报错
{return w *h;
}
void test01()
{printf("%d\n", getRectS(10, 10, 10));
}
int getRectS(int w,int h)//c++中必须加上形参类型。
{return w *h;
}
void test01()
{printf("%d\n", getRectS(10, 10));
}

c中返回值不能检测,形参类型不能检测,函数调用个数不能检测,而c++中这些都可以实现。

3、类型转换监测增强

void test02()
{char * p = malloc(64);//c中不会报错
}

void test02()
{char * p = (char *)malloc(64);//cpp中需要强制类型转换
}

4、struct增强

c++可以放函数,创建结构体变量,可以简化关键字 struct,而c不可以

struct Person
{int age;void func()//C中会报错{age++;}
};

5、bool类型拓展

C语言下,没有bool类型,而c++下有。

bool flag = true; //bool类型 代表 真和假 true ----真(1) false ----假(0)void test04()
{cout << sizeof(bool) << endl; //结果是1个字节//flag = false;//flag = 100; //将非0的数都为1,false为0;cout << flag << endl;
}

6、三目运算符增强

void test05()
{//?:int a = 10;int b = 20;printf("ret = %d\n", a > b ? a : b);(a < b ? a : b )= 100; // C++下返回的是变量  b = 100printf("a = %d\n", a);printf("b = %d\n", b);
}

7、const增强

全局const

c++与c结论一致

const int m_A = 100;

局部const

void test06()
{//m_A = 200;//int * p = (int *)&m_A;//*p = 200;//局部constconst int m_B = 100;//m_B = 200;int * p = (int *)&m_B;//修改失败*p = 200;cout << "m_B = " << m_B << endl;int arr[m_B]; //C++下const修饰的变量称为常量}

外部链接属性

C语言下的const修饰全局变量默认是外部链接属性

//test.c
const int g_a = 1000;
//main.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//外部链接属性:
int main(){extern const int g_a;//告诉编译器在外部有一个g_a //报错:一个无法解析的外部命令:链接出的错printf("g_a = %d\n", g_a);system("pause");return EXIT_SUCCESS;
}

而C++下的const修饰的全局变量默认是内部链接属性

//test.cpp
extern const int g_b = 1000;//可以加关键字extern提高作用域
//const int g_b=1000;//默认是内部链接属性
//main.cpp
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;int main(){extern const int g_b;cout << "g_b = " << g_b << endl;;system("pause");return EXIT_SUCCESS;
}

const分配内存情况

1、 对const变量取地址,会分配临时内存

void test01()
{const int a = 10;//改不掉,因为没有分配内存int * p = (int *)&a;
}

2、使用普通变量初始化const变量的时候

void test02()
{int a = 10;const int b = a;//b分配到栈上//如果把a换成10就修改不成功,因为这时候把b放在符号表中,没有分配内存,没有地址//然后分配了一个临时变量temp给b,让指针p指向bint *p = (int *)&b;//定义一个一级指针储存b的地址*p = 1000;//指针p指向的变量修改为1000//分配内存了,所以修改成功 cout << "b = " << b << endl;}

3、对于自定义的数据类型

struct Person
{string m_Name;//需要包含头文件int m_Age;
};
void test03()
{const Person p={"xiaoming",20};//const变量必须初始化//p.m_Age = 10;//直接修改是失败的Person * pp = (Person *)&p;(*pp).m_Name = "Tom";//pp是一个指针pp->m_Age = 10;cout << "姓名: " << p.m_Name << " 年龄: " << p.m_Age << endl;
}

尽量用const替换define

//define MAX 1024
//undifine 卸载宏
//const int max =1024;//const是有类型的而define没有类型,const有作用域,define没有作用域

引用的基本语法

引用的目的:起别名
引用的基本语法:
类型 &别名 = 原名;
引用必须初始化,并且引用一旦初始化后就不可以引向其他向量。

对数组建立引用

1、直接建立引用

int arr[10];int(&pArr)[10] = arr;for (int i = 0; i < 10; i++){arr[i] = 100 + i;}for (int i = 0; i < 10; i++){cout << pArr[i] << endl;}//用原名方式赋值,别名方式打印

2、先定义数组类型,再通过类型定义引用

typedef int(ARRAY_TYPE)[10];//创建一个10个元素数组类型//类型 &别名 = 原名ARRAY_TYPE & pArr2 = arr;//类型 ARRAY_TYPE 别名 pArr2 //别名可以起多个for (int i = 0; i < 10; i++){cout << pArr2[i] << endl;}

参数的传递方式

1、值传递

void mySwap01(int a  , int b)
{int temp = a;a = b;b = temp;/*cout << ":::a = " << a << endl;cout << ":::b = " << b << endl;*/
}
//只能修改函数里的ab,不能修改函数外的ab

2、地址传递

void mySwap02(int *a, int *b)
{int temp = *a;*a = *b;*b = temp;
}

3、引用传递

void mySwap03(int &a , int &b) // int &a = a; int &b = b;
{int temp = a;a = b;b = temp;
}

引用注意事项

1、引用必须引一块合法内存空间

void test02()
{//int &a = 10;

2、不要返回局部变量的引用

 int &ref = func();cout << "ref = " << ref << endl;cout << "ref = " << ref << endl;//指向了一个局部变量//第一次可以保留,第二次就释放掉了
}

3、函数返回值是引用的时候,可以当做左值去计算

int& func2()
{static int a = 10;//没有被释放掉return a;
}void test03()
{int &ref = func2();cout << "ref = " << ref << endl;cout << "ref = " << ref << endl;cout << "ref = " << ref << endl;cout << "ref = " << ref << endl;//当函数的返回值是引用,可以作为左值去计算func2() = 1000;cout << "ref = " << ref << endl;}

指针引用

p指向指针的指针 *p 指向的是person本体 **p person本体


struct Person
{int age;
};void allocateSpace(Person ** p)
{*p = (Person *)malloc(sizeof(Person));//malloc返回的是void *,然后强制转换为一个Person*(*p)->age = 10;}void test01()
{Person * p = NULL;//定义一个空指针allocateSpace(&p);//通过一段代码给它分配内存cout << "p.age = " << p->age <<  endl;
}
//利用引用可以简化指针
//可以直接用同级指针的引用给同级指针分配空间

malloc动态内存空间分配函数,如果分配成功:则返回指向被分配内存空间的指针。不然,返回空指针NULL。malloc只管分配内存,并不能对其进行初始化。所以得到的一片新内存中,其值将是随机的。一般意义上:我们习惯性的将其初始化为NULL。当然,也可以用memset函数的。void *类型可以强转为任何其他类型的的指针。malloc则必须由我们计算字节数,并且在返回的时候强转成实际指定类型的指针。

引用的自动转换

#include<iostream>
using namespace std;
//发现是引用,转换为 int*const ref = &a
void testFunc(int& ref){ref=100;
}int main()
{int a = 10;int& aRef = a;//自动转换为int* const aRef = &a;//这也能说明引用为什么必须初始化aRef = 20;//内部发现aRed是引用,自动帮我们转换为*aRef = 20;cout<<"a:"<<endl;cout<<"aRef:"<<aRef<<endl;testFunc(a);return EXIT_SUCCESS;
}
void test01()
{//int &ref = 10;//引用必须要有一个合法空间const int &ref = 10; // 加了const之后,相当于写成//int temp = 10;//const int &ref = temp;int *p = (int *)&ref;// int* = const int**p = 10000;cout << ref << endl;//指针修改临时内存
}void showValue(const int &a)//防止修改掉a
{//a = 100000;//把外面的a修改掉了,因为引用指向的是外面的acout << "a = " << a << endl;}

常量引用的使用场景 修饰函数中的形参,防止误操作

void test02()
{int a = 100;showValue(a);}

叁-拾玖|c++入门笔记相关推荐

  1. 金额转换,阿拉伯数字的金额转换为中国传统的形式。例如:327328.96 - 叁拾贰万柒仟叁佰贰拾捌元玖角陆分。

    /** 定义数组存放数字对应的大写 */ private final static String[] STR_NUMBER = {"零", "壹", " ...

  2. vue router 入门笔记

    vue router 入门笔记 tips: components优先级大于component,即当一个route对象里同时配置了component和components时component视为无效 即 ...

  3. 十年公务员转行IT,自学AI三年,他淬炼出746页机器学习入门笔记

    整理 | Jane 编辑 | Just 出品 | AI科技大本营(ID:rgznai100) 近期,梁劲传来该笔记重大更新的消息.<机器学习--从入门到放弃>这本笔记的更新没有停止,在基于 ...

  4. html缩进快捷键_HTML 入门笔记

    HTML 入门笔记 HTML (HyperText Markup Language) 不是一门编程语言,而是一种用来告知浏览器如何组织页面的标记语言. HTML 可复杂.可简单,一切取决于开发者. 它 ...

  5. Python3入门笔记(1) —— windows安装与运行

    Python3入门笔记(1) -- windows安装与运行 Python的设计哲学是"优雅"."明确"."简单".这也是我喜欢Python ...

  6. [Java入门笔记] 面向对象编程基础(二):方法详解

    2019独角兽企业重金招聘Python工程师标准>>> 什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能 ...

  7. 重拾CCNA,学习笔记持续更新ing......(4)

    重拾CCNA,学习笔记持续更新ing......(4) 路由器作用功能的经典解说(笑)(非原创) 假设你的名字叫小不点,你住在一个大院子里,你的邻居有很多小伙伴,在门口传达室还有个看大门的李大爷,李大 ...

  8. React.js入门笔记

    # React.js入门笔记 核心提示 这是本人学习react.js的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...

  9. python3入门与进阶笔记_我的Python3萌新入门笔记

    Python3萌新入门笔记是一系列真实的自学笔记. 当然,它也是比较全面的入门教程,共包括54篇笔记. 从第一篇笔记开始,大半年的时间我都是在自学和组织教程内容. 我觉得有必要,把我自己的学习过程和大 ...

最新文章

  1. 深入浅出神经网络的改进方法!
  2. leetcode-C语言代码练习
  3. 多数据源:spring boot+mybatisplus配置
  4. 简洁的个人导航主页API网站源码 随机背景图
  5. 看我打脸Message Pack
  6. Python中文问题
  7. 眼擎科技CEO朱继志:如何设计自动驾驶的视觉成像系统 | 吃瓜笔记
  8. 编写通用 Hello World 驱动程序 (KMDF)
  9. python免费教程视频-微软推出 Python 免费在线教程视频
  10. 一键加速去不掉加锁的_老旧油渍去不掉?这几款清洁神器帮你轻松搞定油污难题...
  11. 三种常用的js数组去重方法
  12. 查看Linux占用内存/CPU最多的进程
  13. 领域驱动设计学习笔记2
  14. iphone6出信号 无服务器,iPhone6手机无服务(非常见故障点)维修
  15. linux 下压缩解压命令
  16. python 高等数学_Python在高等数学中的应用
  17. 文本分类---逻辑回归(1)
  18. 三层交换机 no switchport 命令
  19. Python-数据类型考试题分析
  20. Pycharm的安装并且连接已有的Python环境实现自由编译(附中文配置)|并通过Pycharm实现增加网站访问

热门文章

  1. Matlab蒙特卡罗模拟
  2. 数据标注软件 【labelimg】
  3. InfluxDB常用函数
  4. 用“等待-通知”机制优化循环等待
  5. c#--在异步方法中异步地等待任务
  6. 【ThinkPad系统重装】
  7. 算术左、右移位与逻辑左、右移位,右移一位和除二的区别、算术溢出
  8. AngularJS PrimeNG 上传文件 进度条
  9. 卡尔曼滤波估计导弹位置Python代码
  10. c语言输出王字图形,专一的王子,C语言volatile关键字解析