C++学习笔记之new和命名空间
一、动态分配内存
C语言的额动态分配内存是通过函数,C++是通过运算符
1、new和delete的用法
delete的两种用法:1、释放单个内存;2、释放连续内存
new的两种用法
分配单个内存初始化和不初始化:
int *p=new int;//分配单个内存,不初始化
int *p=new int(1);//分配单个内存,并且初始化里面得内容为1
申请完内存过后都要记得释放 delete p;//释放单个内存
分配连续内存:
int *p=new int[10];//分配连续内存,并不初始化
memset(p,0,sizeof(int)*4);//全部初始化为0
delete []p;//释放连续内存
使用动态内存时需要注意:
1、内存没有分配就去使用;int *pb; *pb = 10;
解决方法:习惯变量初始化;不仅仅是变量,指针变量习惯初始化NULL;在使用指针前习惯检查指针非空
2、内存分配成功,但没有初始化就使用它;int *pb
= new int; printf("%d\n",*pb);
解决方法:指针变量习惯初始化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;
解决方法:指针释放后赋空值
二、命名空间
命名空间:在文件的基础上对文件里面的内容再次进行分类
命名空间的语法格式:
namespace 命名空间标识符
{
...命名空间成员
}
花括号只有两种情况:1、定义域(必须加分号);2、作用域(可加可不加)
命名空间需要注意的事项:
1、命名空间标识符必须满足标识符的命名规则和命名规范,习惯名字唯一,通常以开发团队的名字(项目名)来命名
2、命名空间可以在全局,也可以在局部(命名空间接受嵌套定义),但不能在函数内和类中定义
3、命名空间的花括号是作用域
4、注意命名污染,尽量规避同名的出现
命名空间访问:(访问所代表的意思是放开权限)
1、using 声明 using 命名空间名称::空间成员名称;
放开一个成员的可见性,这一个成员可以在空间外可见(建议大家使用这种,比较容易避免出现命名污染)
2、using 指示 using namespace
命名空间名;
放开该命名空间的所有权限(所有成员都在空间外可见),适用于该空间的大部分成员都需要经常被使用
3、命名空间名称::空间成员名称
三、C++的输入和输出
cin和cout
需要头文件iostream cin和cout是存放再std这个空间里面得,所以还需要引用命名空间std;std系统得命名空间
如果是要对一个变量赋值:cin>>变量;如果是多个cin>>变量1>>变量2>>变量....;这个不需要格式占位符,它会自己判断类型,这里指的变量不是结构体变量这类的,是一个具体的可以赋值的变量
对一个变量进行输出:cout<<变量;如果是对多个cout<<变量1<<变量2<<变量.....;这个也不需要格式占位符,他也会自己判断类型
cout<<"hello world\n"<<endl;转义字符在C++里面还是可以用的,用“
”双引号括起来输出就可以了,cout<<endl;输出一个换行endl表示换行的意思;
string类(系统封装好的一个字符串类)应为它是一个类,所以它具有类的一些成员,这里不需要了解太多,我们知道这个string类的作用就好了,他是用来存字符串的
string 变量名字="zzzzzz";可以直接赋值一个字符串,内存由系统自动申请和释放
两个string变量之间可以相互直接赋值,用= 赋值,用逻辑运算符进行一个比较是否相等大于,小于
string str1="hello world";
str1.length();得到str1的长度
str1.at(i);返回下标为i的元素的引用
了解:
register关键字 请求编译器让变量a直接放在寄存器里面,速度快
在c语言中 register修饰的变量
不能取地址,但是在c++里面做了内容
register关键字的变化
register关键字请求“编译器”将局部变量存储于寄存器中
C语言中无法取得register变量地址
在C++中依然支持register关键字
C++编译器有自己的优化方式,不使用register也可能做优化
C++中可以取得register变量的地址
C语言在全局里面是可以int a;int a=2;C++不允许这种二义性的操作
注意不要返回一个局部变量,
int &fun()
{
int a=12;
return
a;
}
int
&b=fun();返回的是一个引用,用一个引用来接受
cout<<b<<endl;第一个次没有问题,是系统做的优化
cout<<b<<endl;第二次就是乱值了,因为在函数结束的时候,函数里面a就被释放了
string 类型 字符串类型,使用这个类需需要包含头文件 <string>注意没有.h 如果是打开C语言的是要加.h
C++的不需要