c++基础语法(.cpp)
变量声明:
变量声明类似初始化,注意声明范围,局部变量和全局变量,数组为组合类型
输入输出:
scanf:输入,淘汰不安全,%x:ASCLL码值类型,%s,数组类型
scanf_s(“%s”,&str ,10),输入数组,设定大小输入
memset():按大小设定变量,_s设定范围更多参考帮助c语言中文网 http://c.biancheng.net/cpp/biancheng/cpp/rumen_13/
;c中变量和c++中变量声明,c为暂存于变量名中,c++直接替换&取地址符作用于此
cin,cout:常规,键盘输入输出,不可有空格,>>,<<提取符
cout<<endl;换行
CUP寄存器:eax,edx,ecx等意义?
EAX寄存器以称为累加器,AX寄存器是算术运算的主要寄存器,所有的输入、输出只使用十六进制AL或AX作为数据寄存器
ECX:计数暂存器, 重复(REP)前缀指令和LOOP指令的内定计数器
EDX:资料暂存器 ,例如放整数除法产生的余数
宏定义,有无区分C++与c
const与指针(指向)
封锁:int* const p1 = &a;//指向为常性,封锁指向能力,只能读常,指向能力形同于安全性
引用
*:int *p=10;
释放指针只是释放指向关系——>失效指针——>释放后指向空避免(空指针)
野指针——>未声明指针
&:万能引用const int &c=a,指针需要断言,引用不用(多叠加从右往左解释,引用非类型,故可*****&,而&*非法),相当于*****const
特点:(1)、定义引用必须初始化,(2)、没有空引用,(3)、没有二级引用
引用同一个对象同义,故无二级
区别:
语法上:指针存储实体类型数据,引用为实体别名
程序中:指针需分配空间,引用不用
解引:指针使用需声明,引用不用
指针可以改变值,而引用不行——>指针可为NULL,引用不行
形参使用时,指针需断言,引用不用
sizeof(),参为指针时为指针变量大小,引用为原数据大小
指针无上限,引用只有一级(特点)
对引用操作会影响实体
函数中局部变量和对象无法以引用或指针返回
inline函数
内联函数:将函数定义为内联函数,内联到别的位置,以空间节省时间(优化建议,声明和定义同时使用,避免链接错误),简单函数多次使用
与宏区别:
(1)、内联在编译展开,宏在预编译
(2)、内联函数嵌在目标代码中,带参宏为简单文本替换
(3)、内联函数有类型检测等功能,宏只是替换
缺省参数
声明时函数定义给形参缺省值(即给参数默认值获返回值的函数,从右往左,int(),int{}相当于0,不可调用声明默认值,形参名可省略),调用用实参会顶替默认值
函数重载
c++可以令函数同名,只要参数个数不同,或者类型不同即可(参数表不同),调用是会自动匹配
返回类型不能作为函数重载的根据,重载给缺省值会导致二义性,const只有指向能用作形参
值型:
左值lvalue:有名称有地址
右值rvalue:无地址,&&引用右值,int &&r=10
将亡值xvalue:
值型重载
名字粉碎(名字修饰)
编译时,用由函数名,参数,返回类型,类名,调用约定等共同决定的修士们标识函数
c只会_stdcall是api用栈的方式处理
宏测定判断,#ifdef_cplusplus
extern可定义为为c编写
函数模板
创造函数模板用来简化函数重载实现函数重用,生成实现代码的代码,是规则的重定义,非宏替换
temple<模板参数表>
返回类型 函数名(形式参数表)
{
}
名字空间namespace
c++三域:局部域,名字空间(相当于全局域),类域
namespace 空间名 //全局名字空间域(文件域)
{
声明块
}
防止全局实体名冲突,命名冲突
注意可分层嵌套,起屏蔽作用,多文件多个同名最后合成到同一个命名空间内
使用:引入using namespace 名字空间
成员使用:using 被限定修饰的名字空间::类名::函数名(逐层)
作用域限定符使用:::
using cc=char[3];相当于typedef char[3] cc;查类型重命名?
typedef将合法变量定义为类型
using可和模板配合
temple<claas T,size N>
using array =T[N]
arrray<char,4>//main
array<int *,2>
new//delete
栈区:存放形参,局部变量等地址向下增长
堆区:程序动态内存分配向上增长
栈堆区别?
1、栈是系统自动分配,速度快,堆需要用户自己分配,速度较慢
2、栈申请指定空间不足会报异常,然后申请失败,堆区会将多余部分自动放入空闲位置
3、栈区申请连续内存,大小固定,堆区申请不连续,虚拟空间,获取空间大
4、栈,主函数下第一个命令地址入栈,堆先存大小
int *a=(int *) malloc (sizeof(int));
a=(int *)realloc(p,sizeof(int)n10)要释放原空间所以——
int *a=realloc(p,sizeof(int)n10
动态内存管理:new:(1)、作为运算符使用
new会自动计算大小并分配, int *p=new int(10);
int ip=new int[10];相当于new(ip) int****[10]
对应释放空间delete,一组数据前加[],delete []ip;
int *w=new(nothrow) int[10];可阻止运行异常,默认成所分配内容均为NULL,初始化,返回地址
(2)、函数使用
int *a=(int *)::operator new(sizeof(int));相当于(int *)malloc(sizeof(int))
(int *)::operator new(sizeof(int),nothrow);对应:: operation delete
(3)、定位
(placement new expression)
new(a) int(10);不申请追加,容易越界
内置类型可混用
类型推导:
auto:初始化时,可编译时自动推导出变量类型,auto a=10;
不可批初始化不同类型,&和·*可推导出const与volatile属性,
可做函数形参使用
限制:
1、无法推演出数组(无法区分数组和结构体的{})解决换成&
2、无法成为模板参数
3、不能用作函数参数
4、不能用于非静态成员变量
decltype:decltype(表达式),抽取表达式类型,decltype(a)y;可做形参
基于范围的for:
for(elemtype val:array)
{
}
范围变量名称val在范围数组array内每个元素迭代一次,含auto可const避免无法指向
指针空值——nullptr
NULL被定义为字面常量0或空指针,怎么区分?关键字nullptr代表空指针
nullptr隐式转换为指针类型
静态联编,编译结束时释放空间,动态联编,运行时释放空间
string使用
#include字符串库,c++,std::string 直接用作定义字符串类型
#include<string.h>字符串函数库,c
.at()遍历字符串同字符串数组
面向对象的编程
面向过程:自上而下,用封装逐步实现
对象的状态:静态属性,内部信息变量
对象的行为(方法):函数,
类
class为类型声明符,不分配空间,故extern、auto、register都不能用
访问限定符:public(公有)可外部访问实体对象,private(私有的)和protected(保护的,继承是类似公有)皆不可外部访问,访问符.
和结构体区别:结构体默认都可访问,class默认private不可访问(封装性)