导图社区 C到CPP
C语言转C 预科知识点第02课C到CPP只是在总结,包括C++内存的申请、输入输出、命名空间(namespace)、类的相关内容。
编辑于2021-12-06 14:42:45第2课C到C++
导读
1.内存的申请
new和delete
2.输入输出
cin和cout
3.命名空间
namespace
4.类
string基本使用
5.补充
CPP
1.内存的申请
new和delete
是关键字;不是函数
new(关键字)等价于malloc(函数)
delete(关键字)等价free(函数)
介绍:在C++中申请堆区空间
new的使用
申请的是所需数据类型的大小
1.申请单个内存
int* p0=new int; *p0=666;
用指针存储内存
2.申请单个内存并初始化
int* p1=new int(233);
仅有单个内存时可以用小括号进行初始化
3.申请多个连续的内存
int* p2=new int[5]; //表示申请5个同类型的内存空间 p2[0]=90; *(p2+1)=80;
//补充二维数组+
int* p=new int[3][4];
等价识别为---申请:int[3]的数据类型,申请4个
new的特点
1.是关键字
2.分单个内存申请和连续内存申请
3.只有在单个内存申请下可以用()来进行初始化
delete的使用
1.释放单个内存
delete p0; delete p1;
2.释放连续内存
delete p2;
写法错误
代码不会报错
根据指针的特性,这个操作只会释放首个内存
没有被释放的,我们称为内存泄露--导致产生内存碎片
delete[]p2;
正确写法
在p2前增加中括号会释放到定义结束
3.注意,释放的内存不代表指针丢失,指针还指向原来的地方
若再用指针解引用调用称为非法访问,属于野指针的一种
使用后要置空
p0=nullptr; p1=nullptr; p2=nullptr;
nullptr等价于NULL
delete的特点
1.是个运算符
2.分单个内存释放和连续内存释放
3.使用delete释放内存的时候,对应的指针_指向需要释放内存的首地址
4.释放内存后,指针要置空
常见注意事项
1.指针定义后,要有指向或者置空
定义:int* p; 调用:*p=2;
2.*p没有内容时不能进行数据操作
定义:int* p; 调用:*p++;
3.数组使用不要越界
定义:int p[5]; 调用:p[5]=0;
2.输入输出
cin和cout的使用
int main() { int a,b,c,d,e; 输入: scanf("%d %d",&a,&b); cin>>a>>b; 输出: printf("%d %d",a,b) cout<<a<<b; }
cin和cout一起使用时,对应的>>和<<不是位运算符
使用的准备
要用到
#include<iostream> using namespace std;
#include<iostream>包含了#include<stdio.h>
#include<stdio.h>也能写成#include<cstdio>
cout尽量搭配一个endl,否则,如果程序崩溃,输出可能该停留在缓冲区中,从而导致程序崩溃位置的错误推断
3.命名空间(namespace)
内容导读
当主函数定义如下: #include<iostream> void main() {int num; cin>>num; return 0; }
定义
1.用来组织和重用代码的编译单元
2.多人编写代码时无法避免命名重名问题
用途
C++语言引入命名空间(Namespace)这一概念主要是为了避免命名冲突,其关键字为 namespace。
不同程序拼接后出现的问题: int flag = 1; //小李声明的变量 // …… //中间间隔若干行代码 bool flag = true; //小韩声明的变量
注意:此例仅为解释命名空间所用,在公司的系统开发中并非如此中所述,完全仅靠命名空间来解决命名冲突的,具体编程规范可以参考林锐的《高质量程序设计指南》一书。
如上所示,因为个人习惯不同,小李喜欢声明 int 型变量用于逻辑判断,而小韩则更喜欢采用 bool 类型变量。但两个声明放到同一个函数中的时候,很明显编译器会提示出 flag 变量重新定义的错误。这种问题若不加以处理是无法编译通过的。
声明
可以使用命名空间解决类似上面的命名冲突问题,例如:
namespace Li{ //小李的变量声明 int flag = 1; } namespace Han{ //小韩的变量声明 bool flag = true; }
小李与小韩各自定义了以自己姓氏为名的命名空间,此时将小李与小韩的 flag 变量定义再置于同一个函数体中,则不会有任何问题,当然在使用这两个变量的时候需要指明所采用的是哪一个命名空间中的 flag 变量。
调用
方式1
指定所使用的变量时需要用到::操作符,::操作符是域解析操作符。例如:
Li::flag = 0; //使用小李定义的变量flag Han::flag = false; //使用小韩定义的变量flag
我们已经定义了两个命名空间 Li 和 Han,并在其中各自声明 flag 变量,使用的时候则需要分别用域解析操作符指明此时用的 flag 变量是谁定义出来的 flag 变量,是小韩还是小李定义的。
方式2
除了直接使用域解析操作符,还可以采用 using 声明(using declaration),例如:
using Li::flag; flag = 0; //使用小李定义的变量flag Han::flag = false; //使用小韩定义的变量flag
在代码的开头用 using 声明了 Li::flag,其含义是 using 声明以后的程序中如果出现未指明的 flag 时,则使用 Li::flag,但是若要使用小韩定义的 flag,则仍需要 Han::flag。
1.using调用整个命名空间
using 声明不仅仅可以针对命名空间中的一个变量,也可以用于声明整个命名空间,例如:
using namespace Li; flag = 0; //使用小李定义的变量flag Han::flag = false; //使用小韩定义的变量flag
如果命名空间 Li 中还定义了其他的变量,则同样具有 flag 变量的效果,在 using 声明后,若出现未具体指定命名空间的命名冲突变量,则默认采用 Li 命名空间中的变量。
2.using简化
命名空间内部不仅可以声明或定义变量,对于其它能在命名空间以外声明或定义的实体,同样也都能在命名空间内部进行声明或定义,例如变量的声明或定义、函数的声明或定义、typedef 等都可以出现在命名空间中。
下面我们来看一个简单的 C++ 程序的示例:
#include<iostream> using namespace std; int main(){ cout<<"hello world!"<<endl; return 0; }
1.程序中采用了 using 声明命名空间 std,using namespace std;这一语句涵盖了 std 命名空间中的所有标识符,而该命名空间包含 C++ 所有标准库。
2.头文件 iostream 文件中定义的所有变量、函数等都位于 std 命名空间中,每次使用 iostream 中的变量或函数都需要在前面加上std::是非常麻烦的一件事,为此可直接用 using 声明将 std 中的所有变量或函数等都声明出来。
cout是CPP新定义的输出函数
本节不讲
cin是CPP新定义的输入函数
本节不讲
endl指的是本行末尾,并自动换行
本节不讲
如果不用using namespace std;这一语句,则程序应该像下面这样:
#include<iostream> int main(){ std::cout<<"hello world!"<<std::endl; return 0; }
这样看起来是相当麻烦的,如果在某次使用 iostream 中变量或函数时漏掉 std 则会导致为定义标识符错误。
注意事项
1.命名空间的命名名字必须是合法标识符
2.命名空间可以在全局和局部进行定义
3.命名空间
namespace space { //命名空间的成员--也是作用域 }
namespace space { //命名空间的成员--也是作用域 };
定义域要加分号
4,命名空间不要重名
重名叫做:命名空间的污染
5.命名空间可以嵌套
定义 namespace space { namespace space1 { int num; } };
调用: space::space1::num=1;
6.出现2个名字一样但内容不一样的命名空间,系统会将内容合并
命名空间:取别名
namespace name=space;
namespace 别名=原名;
命名空间:函数
有定义 namespace space { namespace space1 { int num; void function() } };
函数的使用: void space::space1::function() { }
单独的 void function()和命名空间内的内容无关
4.类
string基本使用
what
C++中的一种数据类型
字符串类/字符数组
使用
1,头文件#include<string>
没有.h
2.命名空间
std
应用
string str;
//初始化
str="sdfghjk"
//赋值
int len = str.length();
str.length()//求长度,不包括\0
但是遇到/0也会停止计算,但仍然不计算\0本身。即计算到\0为止
str.clear();
//清空
str.empty();
//判断是否为空,返回BOOL量
空为1
否为0
判断是否相等
补充
1.三步运算符
?:
在C语言中返回是常量
C++中返回变量
2.C++函数必须写返回值类型
故障函数除外
3.函数返回值不要返回局部变量或栈区地址
4.C语言的const和C++的是有极大不同的
C中的const
int main() { const int const a=10; int* p=&a; *p=9; printf("%d",a); }
此处a的值变成了9
const失效了
通过指针修改了值
C++中的const
int main() { const int const a=10; int* p=&a; *p=9; printf("%d",a); }
修改指针数据类型实现匹配 int main() { const int const a=10; const int* p=&a; *p=9; printf("%d",a); }
将指针修改为常量指针
*p=9;禁止修改报错
作业
使用C++,实现一个动态数组,使用命名空间封装好,数组要求能够存放结构体类型
参考答案02-C到C++_2-作业.zip