十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
#define
:宏常量的设置const
:修饰变量\t
:水平制表符,跳到下一个tab的位置,可用于多行输出对齐
int a = rand()%(n-m+1) + m
:产生随机数的范围[m,n]srand((unsigned int)time(NULL));
可利用sizeof()
统计数据类型所占大小
数据类型 | 长度 | 大小 |
---|---|---|
short | 2字节 | 2^±15 |
int | 4字节 | 2^±31 |
long | 4字节 | 2^±31 |
long long | 8字节 | 2^±63 |
数据类型 | 长度 | 大小 |
---|---|---|
float(后加f) | 4字节 | 7位有效数字 |
double | 8字节 | 15~16位有效数字 |
char a=‘x’ 、1字节、单引号、一个字符
实际存储的为对应的ASCII码,‘a’=97、‘A’=65
1个字节,ture——真——非0,false——假——0
3. 运算符 3.1 算术运算符只有整数能够进行取模运算
++a/–a:先加减、再运算
a++/a–:先运算、再加减
+=,-=,*=,/=,%=
==,!=,>=,<=,>,<
!、&&、||
//三种不同的定义方式
int a[10];
int a[10]={1,2...10};
int a[]={1,2...10};
4.2 一维数组名获取整个数组占用内存空间的大小
可以通过数组名到数组首地址
int arr[3]={1,2,3};
cout<<"整个数组的长度:"<
4.3 例//四种定义方式
int arr[2][3];
int arr[2][3]={1,2,3,4,5,6};
int arr[][3]={1,2,3,4,5,6};
int arr[2][3]=
{//推荐此方法,直观,提高代码的可读性
{1,2,3},
{4,5,6}
}
4.5 二维数组名获取整个数组占用内存空间的大小
可以通过数组名到数组首地址
cout<<"整个数组所占空间的大小:"<
5. 指针无论什么类型,都占4个字节(在win32位系统中)
5.1 定义与使用//定义指针
int a=10;
int *p;
p=&a;//为指针赋值(地址)
//使用指针
*p;//解指针,指向内存中的数
5.2 空指针int *p = NULL
int *p = (int *)0x1100
const int *p = &a
int * const p = &a
const int * const p= &a
int *p = arr
//指向数组首地址int a=10,b=20;
swap(&a,&b);
void swap(int *p1.int *p2){int temp = *p1;
*p1=*p2;
*p2=temp;
}
p++;//函数的运算在定义时,不可以省略struct关键字;在使用时,可以省略struct关键字。
//定义结构体(以下皆以此为例)
struct Student{string name;
int age;
};
//创建结构体变量,三种使用方法
struct Student s; s.name="000"; s.age=20;
struct Student s={"000",20}
在定义结构体后创建变量,随后赋初值
6.2 结构体与数组、指针//创建数组变量
struct Student s[2]{{"000",20};
{"001",21};
};
//使用
s[i].name
//创建指针变量
Student s={"000",21};
Student *p = &s;
//使用
p->name
不修改主函数中的数据,使用值传递。修改主函数中的数据,使用地址传递
struct Student s;
void printf1(struct Student p){p.name…………}//值传递
printf1(s);
void printf2(struct Student *p){p->name…………}//地址传递
printf2(&s);
使用指针进行传递,可以减少内存空间,而且不会复制新的副本。
而使用const修饰结构体Student const *p
能够防止误操作
在头文件.h中,只有属性与行为函数的声明
//该文件名为test.h
#pragma once//防止头文件重复包含
#includeusing namespace std;
class P{public:
void setX(int x);
int getX();
private:
int p_x;
}
7.2 源文件在源文件.cpp中,只有行为函数所有的实现
#include "test.h"//包含头文件名
//此时为全局函数,需要加上作用域成为成员函数
void P::setX(int x){p_x=x;
}
int P::getX(){return p_x;
}
8.内存分区模型四个区域,代码区、全局区、栈区、堆区
不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程
在程序编译后,会生成exe可执行程序
四个分区可分为程序执行前(代码区、全局区)与程序执行后(栈区、堆区)
存放函数体的二进制代码(CPU执行的机器指令),由操作系统进行管理
存放全局变量、静态变量、常量(字符串常量,const修饰全局变量)
该区域的数据在程序结束后由操作系统释放
由编译器自动分配释放,存放函数的参数值、局部变量等
不要返回局部变量的地址
由程序员分配(new)和释放(delete),若程序员不释放,程序结束时由操作系统回收
8.5 new操作符在堆区创建数据,返回该数据对应类型的指针
基本语法
int * a = new int(10);//创建
delete a;//释放
开辟数组
int * arr = new int [10];//创建
delete[] arr;//释放
作用:给变量起别名(用不同的变量名操作同一块内存空间)
语法:数据类型 &别名 = 原名
注意:引用必须要初始化;初始化后不能再更改
本质:是一个指针常量(指向不可改,值可改)
int a=10;
int &ref = a;//自动转换为`int * const ref = &a
ref=20;//内部发现ref是引用,自动转换成*ref=20
效果与地址传递相同,能够修改实参,简化了地址传递(指针的使用)
void swap(int &x,int &y){……;
}
//实际上为取别名,将a->x,b->y
swap(a,b);
9.3 返回值引用可以作为函数的返回值存在
不能返回局部变量的引用
int& test(){int a=100;
return a;
}
函数调用能够作为左值使用(如果函数做左值,则必须返回引用)
int& test(){static int a=100;
return a;
}
test()=1000;
防止误操作,修改实参
int &ref=10;//错误,引用本身需要一个合法的内存空间
const int& ref =10;//正确,编译器自动优化代码
ref = 100;//错误,加入const后不可以修改变量
void show(const int& x){x=10;//不能够改变
}
10.函数高级
10.1 默认参数int fun(int a=10,int b=20)
形参中可以有默认参数
void fun(int)
,只有数据类型
函数名相同,提高复用性
引用作为重载的条件
//不同情况
void fun(int &a){} int a=10;fun(a);
void fun(const int &a){} fun(10);
重载碰到默认参数
会出现二义性
void fun(int a,int b=10){}
void fun(int a){};
fun(10);//此时两个都可以调用,分不清
ofstream
:写操作ifstream
:读操作fstream
:读写操作写文件
#include
ofstream ofs;
ofs.open("文件路径",打开方式);
ofs<<"写入的数据";
ofs.close();
文件打开方式
可以配合使用,利于|
操作符
打开方式 | 解释 |
---|---|
ios::in | 为读文件而打开文件 |
ios::out | 为写文件而打开文件 |
ios::ate | 初始位置,文件尾 |
ios::app | 追加方式写文件 |
ios::trunc | 如果文件存在先删除,再创建 |
ios::binary | 二进制方式 |
读文件
包含头文件:#include
创建流对象:ifstream ifs;
打开文件并判断是否成功打开:
ifs.open("文件路径",打开方式);
if(!ifs.is_open(){cout<<"文件打开失败"<
没写绝对路径的话,生成在当前目录
读数据:四种方式
关闭文件:ifs.close();
读数据的四种方式
第一种
char buf[1024] = {0};
while(ifs>>buf){cout<
第二种
char buf[1024] = {0};
while(ifs.getline(buf,sizeof(buf))){cout<
第三种
string buf;
while(getline(ifs.buf)){cout<
第四种(不推荐)
char c;
while( (c=ifs.get())!= EOF ){//EOF 表示end of file
cout《《
}
写文件
包含头文件:#include
创建流对象:ofstream ofs("文件路径",打开方式);
打开文件(可省略):ofs.open("文件路径",打开方式);
写文件
//函数原型:ofstream& write(char *buffer,int len);
Person p={"张三",18};
ofs.write( (const char *)&p,sizeof(Person) );
关闭文件
ofs.close();
读文件
包含头文件:#include
创建流对象:ifstream ifs;
打开文件并判断是否成功打开
ifs.open("a.txt",ios::in | ios::binary);
if(!ifs.is_open()){cout<<"文件打开失败"<
读文件
Person p;
ifs.read( (char *)&p,sizeof(Person) );
关闭文件:ifs.close;
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧