C++与C的区别二
结构体区别
-
类型上不再需要struct关键字,直接使用结构体名即可
-
C++结构体中允许函数存在
-
在结构体中声明,在结构体中实现,当然可以在结构体外实现。
-
学会调用
-
对象.成员
-
对象指针->成员
-
(*对象指针).成员
-
(&对象)->成员
-
-
C++在没有写构造函数和权限限定的时候,用法和C语言的用法是一样
#include<iostream> using namespace std; struct calm { char name[35]; int age; void print() { cout << name << "\t" << age<<endl; //name首地址可输出全部字符串 } void printData(); }; void calm::printData() { cout << name << "\t" << age << endl; } int main() { struct calm boy1 = { "熊大",28 }; calm boy2 = { "熊二",27 }; boy1.print(); boy2.print(); (&boy1)->printData(); (&boy2)->printData(); calm* p = &boy1; p->print(); p->printData(); (*p).print(); }
-
动态内存申请
-
C语言的动态内存申请
-
malloc不带初始化,calloc带初始化,realloc重新申请
-
free释放
-
-
C++的动态申请
-
new和delete
-
类型* 变量=new 类型
-
类型* 变量=new 类型(数据元素)
-
-
单个变量内存申请
-
数组的动态申请
-
结构体内存申请
-
#include<iostream>
using namespace std;
void test1()
{
int* pInt = new int;
*pInt = 123;
cout << *pInt << endl;
char* pChar = new char;
*pChar = 'A';
cout << *pChar << endl;
delete pInt;
pInt = nullptr;
delete pChar;
pChar = nullptr;
}
void print(int array[], int arrayNum)
{
for (int i = 0; i < arrayNum; i++)
{
cout << array[i] << " ";
}
cout << endl;
}
void test2()
{
#if 0
malloc(大小) 申请内存不做初始化
calloc(总数,大小) 初始化全为0,最后申请空间大小为总数 * 大小
realloc(原有空间地址,重新申请的地址长度)给一个已经分配地址的指针重新分配空间
memset()函数原型是extern void
*memset(void *buffer,int c,int count)
buffer:指针或者数组
c:给buffer赋的值
count:是buffer的长度
#endif
int* pMnum = (int*)malloc(sizeof(int) * 3); //相对于int pMnum
if (pMnum == NULL)
{
return;
}
//判断申请是否成功
memset(pMnum, 0, sizeof(int) * 3);
print(pMnum, 3);
int* pCnum = (int*)calloc(3, sizeof(int));
print(pCnum, 3);
int* pint = (int*)malloc(sizeof(int));
if (pint == NULL)
return;
*pint = 2001;
pint = (int*)realloc(pint, sizeof(int) * 3);
pint[1] = 2002;
pint[2] = 2003;
print(pint, 3);
free(pint);
}
int main()
{
test1();
test2();
}
#include<iostream>
using namespace std;
void test3()
{
#if 0
C++的释放有两种写法
delete p; //单个内存
delete[] p; //[]代表当前变量是一段内存
#endif
int* pNum = new int[3]{ 1,2,3 };
for (size_t i = 0; i < 3; i++)
{
cout << pNum[i] << " ";
}
delete pNum;
char* str = new char[20]{'A','B','\0'};
cout << str<<endl;
delete[] str;
}
int main()
{
test3();
return 0;
}
内存池
-
允许大家申请一段内存,共给程序使用,综合管理内存
#include<iostream>
using namespace std;
void test4()
{
#if 0
malloc内存是在堆区
new内存是自由存储区
#endif
char* memorySum = new char[1024];
int* pNum = new(memorySum)int[3]{ 1,2,3 };
//char* pstr = new(pNum + 3)char[20]{ "I Love You" };与下面语句等价
char* pstr=new(memorySum+12)char[20]{ "I Love You" };
for (size_t i = 0; i < 3; i++)
{
cout << pNum[i] << " ";
}
cout << pstr<<endl;
for (size_t i = 0; i < 3; i++)
{
cout << ((int *)memorySum)[i] << " ";
}
cout << (memorySum+12)<<endl;
}
int main()
{
test4();
return 0;
}
String类型
-
string与string.h没有任何关系,string是C++的字符串类头文件,string.h是C处理C字符串类的函数库
故C++string不能用到C语言的字符串处理函数
-
string的创建
-
带初始化
-
不带初始化
-
通过另一个字符串创建
-
-
string的基本操作
-
拷贝
-
赋值
-
连接
-
比较
-
-
C++如何转换为C语言的char*
#include<iostream> using namespace std; int main() { string str1; str1 = "I Love You"; //C++中没有记录\0 cout << str1 << endl; string str2("I Love You"); cout << str2 << endl; string str3="I Love You"; cout << str3 << endl; //拷贝 string str4(str3); cout << str4 << endl; //赋值 string str5=str4; cout << str5 << endl; //连接 string str6="one"; string str7="two"; string str8=str6+str7; //等效string str8=str6.append(str7); cout << str8 << endl; //比较(> < != ==) //等效str6.compara(str7) 0 -1 1 if (str6 > str7) { cout << "大的" << str6 << endl; } else { cout << "小的" << str6 << endl; } //C++如何转换为C语言的char* ,c_str()、data()函数 string ptr1 = "I Love You"; //printf("%s", ptr1); 乱码 printf("%s\n", ptr1.c_str()); printf("%s\n", ptr1.data()); //按F1 string类的成员函数 return 0; }
#include<iostream> using namespace std; int main() { #if 0 为啥char* 类型赋值字符串的时候要用到const C++对const要求更严格两边必须类型一致 指针变量=常量地址 char* ptr = "I Iove You"; 报错 #endif const char* ptr = "I Iove You"; return 0; }
作业
-
C版本
#include <string.h>
#include <stdio.h>
#include <stdlib.h> //malloc
int** createArray2D(int row, int cols) //row行 col列
{
int** pArray = (int**)malloc(sizeof(int*) * row);//申请二级指针,二级指针本质是多个一级指针
if (pArray == NULL)
return NULL;
for (int i = 0; i < row; i++)
{
pArray[i] = (int*)malloc(sizeof(int) * cols);//给一级指针申请
}
return pArray;
}
//有兴趣的可以用传参的方式
void mallocArray2D(int*** pArray, int row, int cols)
{
}
int main()
{
int** p = createArray2D(4, 3);
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
{
p[i][j] = i * j; //赋值
printf("%d\t", p[i][j]); //输出
}
printf("\n");
}
return 0;
}
-
C++版本
#include<iostream>
using namespace std;
int** createArray2D(int row, int cols)
{
int** pArray =new int*[row];
if (pArray == NULL)
return NULL;
for (int i = 0; i < row; i++)
{
pArray[i] = new int [cols]; //给一级指针申请
}
return pArray;
}
int main()
{
int** p = createArray2D(4, 3);
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
{
p[i][j] = i * j; //赋值
printf("%d\t", p[i][j]); //输出
}
printf("\n");
}
return 0;
}