C到C++笔记(一)快速理解

C++的产生

C++是美国贝尔实验室于1980年开发出来的一种过程性与面向对象性结合的程序设计语言。最初他把这种新的语言叫做“含类的C”,到1983年才取名为C++

C++的特点

1, C++保持与C兼容。
2. ,用C++编写的程序可读性更好,代码结构更为合理,可直接地在程序中映射问题空间的结构。
3.,生成代码的质量高,运行效率仅比汇编语言代码段慢10%到20%。
从开发时间、费用到形成的软件的可重用性、可扩充性、可维护性和可靠性等方面均有了很大的提高,使得大中型的程序开发项目变得容易的多。
支持面向对象机制,可方便地构造出模拟现实问题的实体和操作。

命名空间

1,不加using namespace std;cout 和cin 加上作用域分辨符
我们举一个计算机系统中的例子,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名。

在这里插入图片描述
命名空间的语法格式:

namespace 命名空间标识符
{
 ...命名空间成员
}

2,命名空间访问:(访问所代表的意思是放开权限)
(1)using 声明 using 命名空间名称::空间成员名称;
放开一个成员的可见性,这一个成员可以在空间外可见(建议大家使用这种,比较容易避免出现命名污染)
(2)using 指示 using namespace 命名空间名;
放开该命名空间的所有权限(所有成员都在空间外可见),适用于该空间的大部分成员都需要经常被使用
(3)命名空间名称::空间成员名称

#include <iostream>
int main()
{
std::cout<<std::endl;
}
#include <iostream>
using namespace std;
int main()
{
cout<<endl;
}

3,定义一个命名空间

namespace 标识符
{
int  m=0}

4,命名空间的嵌套

namespace a
{
	int m = 100;
	namespace b
	{
		int m = 101;
		namespace c
		{
			int m = 102;
		}
	}
}
调用方式 a::b::c::m=102

5,命名空间需要注意的事项:
(1)命名空间标识符必须满足标识符的命名规则和命名规范,习惯名字唯一,通常以开发团队的名字(项目名)来命名
(2)命名空间可以在全局,也可以在局部(命名空间接受嵌套定义),但不能在函数内和类中定义
(3)命名空间的花括号是作用域
(4)注意命名污染,尽量规避同名的出现

bool 类型

表示真(true)或假(vfalse),0或1,大小为一个字节

  bool  vale;//定义了一个bool 类型的变量vale  这个vale要么是真要么是假

  vale=true;//给赋值为真 或者 1

&引用

1.引用 取别名 必须要初始化 大小占4个字节

取别名,就是对一个变量取别名,对一个变量名取别名

 int a=32; 
 
 int &b=a;//那么这个b就是a的别名,可以直接使用b当作这个int类型的变量a来使用  
 
  b=12;//那么这个a的值就会被改成12

2.引用参数,可以达到在函数内部所操作的数据就是函数外部的数据(相当于地址传递)
引用有大小占4字节,对于传参来说,如果类型比较大,是不是除了指针之外,多了一种选择方式
指针和引用对于效率来说,没有太多区别
3.指针和引用的区别:
(1)指针是一个有内存的实体,引用只是一个外号
(2)引用是常量,常量必须初始化
(3)指针可以赋空值
(4)指针的内存唯一的,引用不唯一
4,传值调用
在这里插入图片描述
5,指针参数
在这里插入图片描述
6,引用参数
在这里插入图片描述

内联函数

在这里插入图片描述
1.通过内存膨胀来减少函数的跳转,空间换时间 函数是:时间换空间

在函数前面加上inline就是内联函数

  inline void fun(){}

2.使用内联函数的限制:
(1)内联函数中不能有循环结构或switch结构及goto语句;
(2)内联函数不能含有任何静态数据及数组声明;
(3)内联函数必须是短小的(一般1-5行)。

如果出现函数体的代码过长,如果有循环,不建议使用内联

什么使用内联:简单的赋值语句,简单的返回语句(函数体少,使用频率高)

函数重载

1.构成函数重载 (1)、函数名一致 (2)、参数列表位置不同 构成函数重载

参数列表位置不同:对应位置不同,参数个数不同,参数类型不同,和返回值不同没有关系

 int sum(int a,int b){return a+b;}

 void sum(double a,double b){printf("%lf",a+b)}

这个sum函数构成函数重载

2.顺序不一样(建立在有不同的类型)

void fun(int a,double b)
{
cout << "顺序不一样";
}
void fun(double b, int a)
{
cout << "顺序不一样";
}

函数的缺省参数

1、参数的缺省只能由后往前缺省,依次缺省,不能由前往后

void fun(int a,int b=2,int c=3);//可以这样写

void fun(int a,int b=2,int c);//不可以可以这样写

2、参数的缺省,在只有定义的情况下可以直接写在定义上,如果有声明,只要在声明中缺省,定义不需要

定义:void fun(int a,int b,int c);

声明:void fun(int a,int b=2,int c=3);

3、缺省参数的过程,如果对应位置不给出实参,就直接用缺省的参数,如果给出实参,会用实参替换掉缺省的参数

new和delete

1,动态分配内存
C语言的动态分配内存是通过函数,C++是通过运算符
new和delete的用法
delete的两种用法:(1)释放单个内存;(2)释放连续内存
new的两种用法

(1)分配单个内存初始化和不初始化:
int *p=new int;//分配单个内存,不初始化
int *p=new int(1);//分配单个内存,并且初始化里面得内容为1
delete p;//释放单个内存
(2)分配连续内存:
int *p=new int[10];//分配连续内存,并不初始化
memset(p,0,sizeof(int)*4);//全部初始化为0
delete []p;//释放连续内存

申请完内存过后都要记得释放
2,使用动态内存时需要注意:
(1)内存没有分配就去使用;int *p; *p = 10;
解决方法:习惯变量初始化;不仅仅是变量,指针变量习惯初始化NULL;在使用指针前习惯检查指针非空
(2)内存分配成功,但没有初始化就使用它;int *p = new int; cout<<*p<<endl;
解决方法:指针变量习惯初始化NULL;在使用指针前习惯检查指针非空
(3)内存分配成功,也初始化了,但操作越界
int *pb = new int[4]; for(int i = 0; i <= 4; ++i) pb[i] = i + 1;
解决方法:写代码的时候多加留意,是否多做一次或几次循环,或者首地址指针移位了
(4)忘记释放内存,造成内存泄露;

 for(int i = 0; i < 4; ++i) { int *pb = new int[4];}

解决方法:习惯在动态内存分配时就立马写上释放,让分配和释放逻辑配对
(5)释放了内存,却继续使用它

 int *pm = new int; *pm = 10; delete pm; *pm = 10;

解决方法:指针释放后赋空值

string类

系统封装好的一个字符串类,所以它具有类的一些成员,

string 变量名字="zzzzzz"

可以直接赋值一个字符串,内存由系统自动申请和释放
两个string变量之间可以相互直接赋值,用= 赋值,
用逻辑运算符进行一个比较是否相等大于,小于

string str1="hello world";
str1.length();得到str1的长度
str1.at(i);返回下标为i的元素的引用

string 类型 字符串类型,使用这个类需需要包含头文件 注意没有.h 如果是打开C语言的是要加.h C++的不需要

总结

指针和引用的区别这点很重要。
申请完内存过后一定要记得释放。
函数不可以返回自动变量的引用。因为函数返回时,该自动变量即被撤销。

猜你喜欢

转载自blog.csdn.net/qq_45893999/article/details/106398271