第一部分C++基础语法-创新互联
#define
:宏常量的设置const
:修饰变量
- 不是关键字
- 下划线、字母、数字组成,数字不能在开头
- 区分大小写,见名知意
- 3e2:表示3*10^2
- 3e-2:表示3*0.1^2
\t
:水平制表符,跳到下一个tab的位置,可用于多行输出对齐
int a = rand()%(n-m+1) + m
:产生随机数的范围[m,n]
rand 函数产生的随机数是伪随机数,是根据一个数按照某个公式推算出来的,这个数我们称之为“种子”,但是这个种子在系统启动之后就是一个定值。要想每次产生的随机数不一样,那么,我们就要用到 srand 函数。srand((unsigned int)time(NULL));
种子,利用时间的不同产生不同的随机数
- break:switch语句、跳出当前循环、跳出内层循环
- continue:跳出本次循环,进入下一次循环
- goto 标志:跳转到标记的位置
可利用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
- C风格:char str[]=“hello”,双引号
- C++风格:string str=”hello”,需添加头文件#include
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 例- 逆置元素
双指针start、end,条件start>end - 冒泡
第一层,个数-1;第二层,个数-轮数(i)-1
//四种定义方式
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 空指针- 定义:指针变量指向内存中编号为0的空间
- 用途:初始化指针变量
int *p = NULL
- 注意:空指针指向的内存是不能访问的(0~255为系统占用内存,不允许用户访问)
- 指针变量指向非法的内存空间
int *p = (int *)0x1100
- const修饰指针——常量指针
const int *p = &a
指针的指向可以改,指针指向的值不可以改 - const修饰常量——指针常量
int * const p = &a
指针的指向不可以改,指针指向的值可以改 - const既修饰指针,又修饰常量
const int * const p= &a
指针的指向和指向的值都不能改
- 与数组
int *p = arr
//指向数组首地址 - 函数
p++;//函数的运算int a=10,b=20; swap(&a,&b); void swap(int *p1.int *p2){int temp = *p1; *p1=*p2; *p2=temp; }
在定义时,不可以省略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)
,只有数据类型
- 调用时需要有参数调补该位置,可以有默认参数
函数名相同,提高复用性
- 条件
- 同一个作用域
- 函数名相同
- 参数类型不同 or 个数不同 or 顺序不同(返回值类型不同不是条件)
- 注意事项
引用作为重载的条件
//不同情况 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);//此时两个都可以调用,分不清
- 程序运行时产生的数据属于临时数据,程序一旦运行结束都会被释放,而通过文件可以将数据持久化
- 对文件的操作需包含头文件
- 文件类型
- 文本文件:以文本的ASCII码的形式存储
- 二进制文件:以文本的二进制形式存储
- 操作文件三大类
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元起,快前往官网查看详情吧
网站栏目:第一部分C++基础语法-创新互联
当前URL:http://ybzwz.com/article/psjso.html