new-delete语法简介
a)C语言中需要使用malloc与free申请与释放堆空间:
b)C++把堆空间申请与释放做成关键字,底层也是malloc和free。
c)用起来绝对舒服,成为关键字不用包含头文件。
d)就如同栈一样的模式,比如:栈内申请一个数组:
int a[20];
int* p = new int[20];//堆数组
#include<stdio.h>
#include<stdlib.h>
void Input(int* p, int nLen)
{
while (nLen--)
*p++ = nLen * 103 / 22;
}
void Print(const int* p, int nLen)
{
while (nLen--)
{
printf("%d ", *p++);
}
}
int main()
{
//栈
int a[20];
Input(a, _countof(a));
Print(a, _countof(a));
printf("\n");
//堆空间
int n = 20;
int* p = new int[n];//给我来20个int
Input(p, n);
Print(p, n);
delete []p; //用完记得释放
printf("\n");
//malloc申请堆空间
int* q = (int*)malloc(sizeof(int)*20);
Input(q, n);
Print(q, n);
free(q); //用完记得释放
return 0;
}
栈 堆 申请变量
#include<stdio.h>
#define N 100
struct SData
{
int nNumb;
char sName[20];
float fSalary;
};
int main()
{
//栈上申请单个变量
int n = 888;
double d = 999.99;
double a[N] = {88.88}; //栈内申请数组只能是常量
SData data = { 1002,"Alice",999.22f };
//堆上申请单个变量 98版本支持() 简单类型的变量 TYPE *x = new TYPE[N] N可以是变量 delete []x 申请时带中括号[],释放的时候也要带[]
int* x = new int(888);
int* p = new int;
*p = 888;
delete p;
double* y = new double(999.99);
delete y;
// 11版本 推荐都用{ } 涉及大括号{}都是11版本
int* q = new int{ 888 };
delete q;
int n1 = 30;
double* ds = new double[n1] {88.88, 98, 33, 33, 555}; // N可以是变量
delete[]ds; // 释放时才有机会发现越界
SData* m = new SData{ 1002,"Alice",999.22f };
delete m;
return 0;
}
一、 cin和cout语法简介
a)C++系统的头文件不加.h,故意可以防止与自己的头文件冲突。
b)cin和cout最大的特点就是类型自动识别,比printf的%d,%f要好用多了
c)cin的时候也不用取地址,为什么呢?实际上内部语法是引用型变量(自动转帮你取地址)。
d)cout <<“\n"一般会使用cout << endl;代替//end of line
cout 不足之处是占位不如printf(”%-8.2f"…)好用。
#include<iostream>
using namespace std;
int main()
{
int n1;//代表3个学号
char s1[20];
float m1;//math
float c1;//chinese
float e1;//english
float sum1;
float average=0;
int i = 0; //cin cout 最大的特点时类型自动识别
//printf("请输入第 %d个同学的学号、姓名和成绩(语数英):", ++i);
cout << "请输入第 " << ++i << "个同学的学号、姓名和成绩(语数英):";
cin >> n1 >> s1 >> m1 >> c1 >> e1;
cout << n1 << "\t" << s1 << "\t" << m1 << "\t" << c1 << "\t" << e1 <<
"总分:" << m1 + c1 + e1 << "平均:" << (m1 + c1+e1) / 3 << endl; //endl 相当于 \n
return 0;
}
二、namespace命名空间
a)这个语法是为了解决变量和函数名字冲突;
b)比如每个程序员用自己的姓名作为分类名称,namespace类似加了一个外壳。
c)using namespace xxx,就代表把壳去掉。
#include<iostream>
using namespace std;
namespace XQ
{
double g1 = 0.8;
int add(int a, int b)
{
return a + b;
}
}
double g1;
//命名空间 解决变量和函数名字冲突
int main()
{
XQ::g1 = 888.88;
XQ::add(6, 8);
g1 = 99.999;
cout << "XQ::g1的地址" << &XQ::g1 << endl;
cout << " g1的地址" << &g1 << endl;
return 0;
}
2.using namespace std
#include<iostream>
//using namespace std; 打破std的壳子 打破之后不需要每一个都加std::
namespace XQ
{
double g1 = 0.8;
int add(int a, int b)
{
return a + b;
}
}
double g1;
using namespace XQ; //破了壳可直接调用
//命名空间 解决变量和函数名字冲突
int main()
{
XQ::g1 = 888.88;
add(6, 8);
::g1 = 99.999; //::无壳 裸漏的变量
std::cout << "XQ::g1的地址" << &XQ::g1 << std::endl; //没有using 就要加壳子 std::
std::cout << " g1的地址" << &::g1 << std::endl;
return 0;
}