第2节课:9.2:从c到c++的过渡
一、new(是什么?怎么定义?怎么使用?)
1.知识点:
是一种运算符,用来向堆区申请内存;
2.使用:
1.可以在申请的内存并初始化
2.可以申请连续内存
3.一定要记得手动释放申请到的堆区内存
3.易错点
new之后没有释放堆申请到的内存,出现内存泄漏的情况
4.review
memset函数:可以给连续内存赋值
赋值方式:单个字节这样赋值
头文件:#include <string.h>
//parameter:要赋值的指针,赋值的内容,赋值的内存大小
memset(p2,1,sizeof(int)*10);//
一般new和delete成对出现
#include <stdio.h>
int main()
{
int*p = new int;//开辟一个int四个字节大小的内存,没有给初值
int *p1 = new int(10);//开辟一个四个字节,并赋给初值10
int *p2 = new int[10];//开辟一个10个int大小的连续内存,为赋初值
for (size_t i = 0; i < 10; i++)
{
p2[i] = i + 1;
}
for (size_t i = 0; i < 10; i++)
{
printf("%d\n",p2[i]);
}
printf("%d",*p1);
//delete
delete p;
p = nullptr;
delete p1;
p1 = nullptr;
delete[]p2;
p2 = nullptr;
}
二、delete
1.知识点:
是一种运算符,用来删除堆区内存(不能用来删除栈区内存)
使用:
1.delte只能指向要delete的对象的首地址
2.delete后要置空指针
3.delete删除单个内存和多个内存的区别
4、delete是运算符
三、动态操作内存的常见错误
1.没有给指针指向的对象初始化就给指针赋值? .
????????????????
2.动态分配了内存但是没有初始化就解析引用
3.内存分配成功但是操作越界,可能指针修改了不该修改的地址里面的内容
4.delete指针后还对指针进行操作
5.内存泄漏
int*p = new int;//开辟一个int四个字节大小的内存,没有给初值
*p = 10;
delete p;
*p = 20;
printf("%d\n",*p);
四、c++中的命名空间(相当于一把锁)
1. 是什么:是一种作用域,用来避免命名污染的。把相同的名字都放到不同的空间里,来防止名字的冲突
2.定义:
1.成员可以在作用域外定义
2.在作用域内直接定义
3.使用方法:
要使用命名空间内的成员函数:
1.声明:using 命名空间名 :: 函数名;
2.指令:using (关键字)namespace 命名空间名;
namespace Myprintf
{
void fun()
{
printf("可恶\n");
}
}//作用域后不用加;while和if的{}都是作用域不是表示定义
//若是表示定义,例如struct和class 则要加;
namespace Mymath
{
int Myadd(int a,int b);
}
int Mymath::Myadd(int a,int b)
{
return a+b;
}
struct tag
{
int a;
int b;
};
using namespace Mymath;
using Myprintf::fun;
int main()
{
fun();
printf("%d\n",Myadd(1,2));
}
4.注意:
1.一般在.h文件中写命名空间的成员在.cpp文件中定义
(.cpp文件会被编译,.h文件不会背编译)
2.使用指令的方法则会使命名空间内的所由成员曝光
最好使用声明的方法
五、cout和cin和endl
1.是什么:是命名空间std内的函数
2.使用方法:
1.需要包含头文件
2.可以连续输入
#include <iostream>
using namespace std;
int main()
{
int a, b, c;
cin >> a >> b >> c;
cout << "你是猪" <<endl<<a<<endl<<b<< endl<<c<<endl;
return 0;
}
六、string类
1.是什么:c++一个类有很多操作符重载可以代替string函数简化code
2.使用:
1.包含头文件没有.h还有命名空间std的声明或者指令
#include <iostream>
#include <string>
#include <string.h>
#include <stdio.h>
using namespace std;
int main()
{
string str1 = "adga";
string str2 = "sdg";
string str = str1 + str2;
printf("%s\n",str);//为什么输出有误,因为string是一个对象
cout << str << endl;
cout << str.length() << endl;
}