page contents

C++学习笔记2

C++学习笔记——new、命名空间和输入输出的使用
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++的不需要
  • 发表于 2021-05-26 16:16
  • 阅读 ( 577 )
  • 分类:C/C++开发

0 条评论

请先 登录 后评论
小威
小威

64 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1312 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章