C++笔记 day26 C++概述,命名空间,const,引用

66 阅读1分钟

C++概述

C++ 是兼容于C的,有C语言代表的面向过程的思想

C++两大编程思想

  1. 面向对象

  2. 泛型编程

移植性和标准

ANSI 在1998制定出C++第一套标准

c++初识

引入头文件  #include 标准输入输出流

使用标准命名空间   using  namespace  std;

标准输出流对象 cout << “..” << 1234 << 3.14 << endl;

image.png

示例: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命名空间

  1. 命名空间用途:解决名称冲突

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

  3. 命名空间必须要声明在全局作用域

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

       namespace B
     {
         int m_A =100;
         namespace C
         {
              int m_A = 20;
         }
     }
    
     使用:B::C::m_A
    
  5. 命名空间是开放的,可以随时将新成员添加到命名空间下

  6. 命名空间可以匿名的

     当写的命名空间是匿名的相当于写了static 
    
  7. 命名空间可以起别名

         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;
  1. 当using编译指令  与  就近原则同时出现,优先使用就近

  2. 当using编译指令有多个,需要加作用域 区分

C++对C语言增强以及扩展

1. 全局变量检测增强

int a;

int a = 10;//C下可以,C++重定义

2. 函数检测增强

  1. 函数的返回值

  2. 形参类型

  3. 函数调用参数个数

3. 类型转换检测增强

char * p = (char *)malloc(64)  C++下必须等号左右一致类型

4. struct 增强

  1. C++可以在结构体中放函数

  2. 创建结构体变量   可以简化关键字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=100b =100是一个结合的表达式)。

7. const增强

C语言下

     全局const   直接修改 失败  间接修改  语法通过,运行失败

     局部 const  直接修改  失败  间接修改  成功

image.png

C++语言下

     全局 const  和C结论一样

     局部 const  直接修改失败   间接修改 失败 

     C++const可以称为常量,可以初始化数组

image.png

image.png

const 链接属性

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

2. C++下const修饰的全局变量默认是内部链接属性,可以加extern 提高作用域
     
在本文件中可以使用,其他文件中用不了。

const分配内存情况

1. 对const变量 取地址 ,会分配临时内存,不能间接修改

2. 使用普通变量  初始化 const变量,分配内存,可以间接修改掉

3. 对于自定义数据类型,分配内存,可以间接修改掉

尽量用const代替define

define出的宏常量,没有数据类型、不重视作用域

引用

  1. 目的:起别名

  2. 语法: 类型(与原名类型必须一致)   &别名  =  原名

  3. 引用必须要初始化

  4. 引用一旦初始化后,就不可以引向其他变量

  5. 建立对数组引用

    1. 直接建立引用

      int arr[10];

      int(&pArr)[10] = arr;

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

      typedef int(ARRAY_TYPE)[10];

      ARRAY_TYPE & pArr2 = arr;

参数的传递方式

1. 值传递

2. 地址传递

3. 引用传递,其实本质还是地址传递

注意事项

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

image.png

  1. 不要返回局部变量的引用(局部变量可以加static)

image.png

  1. 当函数返回值是引用时候,那么函数的调用可以作为左值进行运算

image.png

指针的引用

image.png

利用引用可以简化指针

可以直接用同级指针的 引用  给同级指针分配空间

示例:简化前

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;

image.png

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

image.png