C++概述
C++ 是兼容于C的,有C语言代表的面向过程的思想
C++两大编程思想
-
面向对象
-
泛型编程
移植性和标准
ANSI 在1998制定出C++第一套标准
c++初识
引入头文件 #include 标准输入输出流
使用标准命名空间 using namespace std;
标准输出流对象 cout << “..” << 1234 << 3.14 << endl;
示例:hello world
#include <iostream> //标准输入输出流 i - input输入 o - output输出 相当于 stdio.h
using namespace std; //使用 标准 命名空间
int main()
{
//cout 标准输出流对象
// << 左移 在 C++下有了新的语义 用于在cout后拼接输出的内容
// endl --end line 刷新缓冲区 并且换行
cout << "hello world" << endl;
system("pause"); //阻塞
return EXIT_SUCCESS;
}
cout要输出str类型的变量需要包含头文件 <string>
面向对象三大特性
封装、继承、多态
双冒号作用域运算符
::代表作用域 如果前面什么都不添加 代表全局作用域
示例
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
int atk = 1000;
void test01()
{
int atk = 2000;
cout << "atk = " << atk << endl; //输出2000,就近原则
// :: 代表作用域 如果前面什么都不加,代表全局作用域
cout << "全局 atk‘= " << ::atk << endl;
//如果没有使用命名空间 在 :: 前加 std 也可以使用 cout
}
int main()
{
test01();
system("pause");
return EXIT_SUCCESS;
}
namespace命名空间
-
命名空间用途:解决名称冲突
-
命名空间下可以存放 : 变量、函数、结构体、类…
-
命名空间必须要声明在全局作用域
-
命名空间可以嵌套命名空间
namespace B { int m_A =100; namespace C { int m_A = 20; } } 使用:B::C::m_A
-
命名空间是开放的,可以随时将新成员添加到命名空间下
-
命名空间可以匿名的
当写的命名空间是匿名的相当于写了static
-
命名空间可以起别名
namespace veryLongName { int m_R =1000; } namespace shortName = veryLongName; 使用 shortName:: m_R
using声明以及using编译指令
using声明
using KingGlory::sunwukongId
当using声明与 就近原则同时出现,出错,尽量避免
using编译指令
using namespace KingGlory;
cout << sunwukong << endl;
-
当using编译指令 与 就近原则同时出现,优先使用就近
-
当using编译指令有多个,需要加作用域 区分
C++对C语言增强以及扩展
1. 全局变量检测增强
int a;
int a = 10;//C下可以,C++重定义
2. 函数检测增强
-
函数的返回值
-
形参类型
-
函数调用参数个数
3. 类型转换检测增强
char * p = (char *)malloc(64) C++下必须等号左右一致类型
4. struct 增强
-
C++可以在结构体中放函数
-
创建结构体变量 可以简化关键字struct
5. bool数据类型扩展
C++才有bool类型
代表真 --- 1 true 假 ---- 0 false
sizeof = 1
值会将非0的数都转为1
6. 三目运算符增强
C语言下返回的是值
C++语言下返回的是变量
a > b ? a : b;// 如果a大于b返回a,否则返回b
a < b ? a : b = 100;//如果a小于b返回a,否则返回b=100(b =100是一个结合的表达式)。
7. const增强
C语言下
全局const 直接修改 失败 间接修改 语法通过,运行失败
局部 const 直接修改 失败 间接修改 成功
C++语言下
全局 const 和C结论一样
局部 const 直接修改失败 间接修改 失败
C++const可以称为常量,可以初始化数组
const 链接属性
1. C语言下const修饰的全局变量默认是外部链接属性
2. C++下const修饰的全局变量默认是内部链接属性,可以加extern 提高作用域
在本文件中可以使用,其他文件中用不了。
const分配内存情况
1. 对const变量 取地址 ,会分配临时内存,不能间接修改
2. 使用普通变量 初始化 const变量,分配内存,可以间接修改掉
3. 对于自定义数据类型,分配内存,可以间接修改掉
尽量用const代替define
define出的宏常量,没有数据类型、不重视作用域
引用
-
目的:起别名
-
语法: 类型(与原名类型必须一致) &别名 = 原名
-
引用必须要初始化
-
引用一旦初始化后,就不可以引向其他变量
-
建立对数组引用
-
直接建立引用
int arr[10];
int(&pArr)[10] = arr;
-
先定义出数组类型,再通过类型 定义引用
typedef int(ARRAY_TYPE)[10];
ARRAY_TYPE & pArr2 = arr;
-
参数的传递方式
1. 值传递
2. 地址传递
3. 引用传递,其实本质还是地址传递
注意事项
- 引用必须引一块合法内存空间
- 不要返回局部变量的引用(局部变量可以加static)
- 当函数返回值是引用时候,那么函数的调用可以作为左值进行运算
指针的引用
利用引用可以简化指针
可以直接用同级指针的 引用 给同级指针分配空间
示例:简化前
void allocateSpace(Person** p)
{
//p 指向指针的指针 ;* p 指针,指向 person本体; **p 本体
*p = (Person*)malloc(sizeof(Person));
(*p)->age = 10;
}
void test01()
{
Person* p = NULL;
allocateSpace(&p);
cout << "p.age =" << p->age << endl;
}
示例:简化指针引用
void allocateSpace1(Person*& pp)// Person * &pp =p;
{
pp=(Person *)malloc(sizeof(Person));
pp->age = 20;
}
void test02()
{
Person* p1 = NULL;
allocateSpace1(p1);
cout << "p.age =" << p1->age << endl;
}
常量的引用
const int &ref = 10;
// 加了const之后, 相当于写成 int temp = 10; const int &ref = temp;
常量引用的使用场景 修饰函数中的形参,防止误操作