发散复习了C++ premier plus的一、二、三章节部分并予以记录(吐槽:该书遇到知识点通常会提一句然后告知之后再详述,导致有些知识点略显分散)
一、简单编程
1.C++包含的编程方式有过程性方式、面向对象方式、泛型方式
2. yum install gcc-c++指令在centos7虚拟机安装用于编译的g++
注1:记得修改NAT配置文件onboot、dns使网络连通
g++ test.cpp
生成可执行文件a.out
g++ test.cpp -o test
生成可执行文件test
g++ -c test.cpp
生成test.o
g++ -g -c test.cpp
生成带调试信息的test.o
g++ test.o other.o -o test
链接目标文件,生成可执行文件test
3.vim或touch或图形界面新建并vim编写文件-->g++ main2021.cpp -o main2021-->运行./main2021
注1:linux中sh启动表示指定由名为sh的shell运行文件,./则是识别文件开头标注的解释器进行解释,默认也是sh
注2:用g++编译生成动态连接库*.so、静态库.a的方法及连接的方法参考https://blog.csdn.net/qq_34199383/article/details/80308782
实验代码:这里用到了返回函数字符串的方法之一,即传入指针(常用还有使用静态变量、全局变量、malloc函数动态分配)
#include <iostream>
using namespace std;
void coverMethod(char* username){
char name[50];
cout<<"welcome to my world"<<endl;
cout<<"plz tell me your name"<<endl;
cin>>name;
username=name;
}
int main() {
char* username;
cover(username);
cout<<"hallow"<<*username<<endl;
}
二、基础知识点
1.C++中;作为终止符存在,是语句的一部分
2.标准中main的类型应当设置为int(可以特殊省略返回语句),void可能会出现无法运行(主函数返回值给操作系统,是有用的<比如判断是否成功运行的依据>)
3.main函数仅在极特殊情况如机器人芯片可缺失,可以认为是必须有且仅有一个
4.注释//和多行注释/* */
5.头文件命名约定
(1)如果C++程序中使用了带后缀".h"的头文件,那么不必在程序中声明命名空间,只需要文件中包含头文件即可;
(2)C++标准要求系统提供的头文件不带后缀".h",但为了表示C++与C的头文件既有联系又有区别,C++中所用头文件不带后缀".h",而是在C语言的相应头文件名之前加上前缀c:
6.工程中命名空间需要规范使用,用到方法添加在using 空间名::方法名,不要偷懒<using对命名空间的授权范围等同于语句所在的作用域>
7.转义字符
\a 响铃(BEL) 007
\b 退格(BS) 008
\f 换页(FF) 012
\n 换行(LF) 010
\r 回车(CR) 013
\t 水平制表(HT) 009
\v 垂直制表(VT) 011
\\ 反斜杠 092
\? 问号字符 063
\' 单引号字符 039
\" 双引号字符 034
\0 空字符(NULL) 000
\ddd 任意字符 三位八进制
\xhh 任意字符 二位十六进制
\a:蜂鸣,响铃
\b:回退:向后退一格
\f:换页
\n:换行,光标到下行行首
\r:回车,光标到本行行首
\t:水平制表
\v:垂直制表
\\:反斜杠
\':单引号
\":双引号
\?:问号
\ddd:三位八进制
\xhh:二位十六进制
\0:空字符(NULL),什么都不做
8.四条标准源代码风格
(1)每条语句占一行
(2)每个函数都有一个开始花括号和一个结束花括号,这两个花括号各占一行
(3)函数中的语句都相对于花括号进行缩进
(4)与函数名相关的花括号周围没有空白
9.C++语句类型
(1)声明语句:定义函数种使用的变量的名称和类型,向计算机提供了需要的内存类型和该内存单元的名称。
(2)赋值语句:使用赋值运算符(=)给变量赋值,从右到左执行
(3)消息语句:将消息发送给对象,操作对象进行行为。
(4)函数调用:执行函数,被调用的函数被执行完毕后,程序返回到函数调用语句后面的语句。
(5)函数原型:声明函数的返回类型、函数接受的参数数量和类型。
(6)返回语句:将一个值从被调用的函数那里返回到调用函数中。
10.类简介:描述数据格式及其用法,对象是根据这些描述创建的实体。
11.过程性编程推荐以方法声明——>主函数——>方法定义的结构进行
12.函数的定义平等,不能允许定义的嵌套
13.cout等类对象名不属于关键字可以用作变量名,但这类命名极其容易造成混淆
14.注意命名风格的统一:我将采用函数的驼峰命名法(缺补Method),变量的蛇形全小写命名,类名的全大写命名。
15.预处理#include将其他文件的内容复制进来,#define INT_MAX 3060将文件中所有单独的INT_MAX模块找出并替换成3060(c语言保留方法C++更常用const关键词修饰设置常量)
三、处理数据<整数和浮点数统称算术类型>
1.变量的内涵:(1)存在哪里(2)存储什么值(3)存储何种类型的信息
2.变量名:下划线或字符开头的字母、数字、下划线列。但是下划线有留用,最好不要用于开头。(推荐前缀的命名风格,如b_switch)
3.整型:宽度<用于描述整数存储内存量>排序——char(8可记录数字)、short(16)、int(32)、long(32)、long long(64)
(1)sizeof运算符获取变量或类的占用字节
(2)除了一般=赋值外,还允许使用如int wrens(432)和char c1{66}<等同char c1={66}且空括号默认零值>这样的赋值方法<后者不允许缩窄>
(3)使用unsigned声明正值范围更大但是不能存储负数的无符号变体。
(4)整型变量的溢出行为等同于时钟((unsigned short)0-(unsigned short)1=65535)。
(5)如果没有特殊理由就选用int,变量不可能为负值可标注无符号,值超达时考量类型范围,仅当有大型整型数组时才有必要选择short。
(6)默认情况cout以十进制展示整型变量<使用cout<<hex/oct/dec这样的命令进行设置>,前缀0表八进制0x为十六进制,否则默认十进制。
(7)程序如无特殊将会将数字常量视为int类型,L后缀表示long型,LL表示long long,U如ULL标识无符号类型
(8)早期字符常量会被视为int,现在已经直接视为char
(9)\u标识的ISO 10646码点通用字符名
(10)char在默认情况下并非无符号也不是有符号数,在必要时需要显示表示
(11)wcha_t是需要使用wcout/wcin处理的两字节的宽字符类型<用于国际编程或使用Unicode或ISO 10646时>
(12)C++新增的char16_t(16)/char32_t(32)的底层实现是一种内置整型
(13)bool型字面值true或false,任何数字或指针值都可以隐式转换到
4.const限定符与常量
(1)常用大写首字母的方法命名常量<也可以整个大写>
(2)如果在声明常量时没有提供值,则该常量的值将是不确定的,且无法修改
5.浮点数:float(32),double(64),long double(80/96/128)
(1)有标准小数点表示法<8.0>或E表示法<2.14E7>两种表示方法
(2)float有6~7位准确的有效值,double有13位以上准确的有效值
(3)后缀L表示long double,后缀f表示float
(4)浮点运算的速度通常比整数运算慢,且精度 将降低
6.C++算术运算符
(1)五种基本运算包括加、减、乘、除、求模
(2)/运算时若操作数全为整数则丢弃结果小数部分
(3)求模运算的符号参照被求模数的符号
(4)c++语句从右往左进行,但运算符的结合性是从左往右进行的
(5)可用cout.setf()控制输出
(6)浮点常量在默认情况下为double类型
(7)值会被转换为接受变量的类型,但超出范围时会出问题,用{}方法进行防止缩窄<不允许高阶变量赋给低阶,常量则会评估是否超出范围>的控制
(8)表达式转换
如果有一个操作数的类型是 long double,则将另一个操作数转换为 long double。
否则,如果有一个操作数的类型是 double,则将另一个操作数转换为 double。
否则,如果有一个操作数的类型是 float,则将另一个操作数转换为 float。
否则,说明操作数都是整型,因此执行整型提升。
在这种情况下,如果两个操作数都是有符号或无符号的,且其中一个操作数的级别比另一个低,则转换为级别高的类型。
如果一个操作数为有符号的,另一个操作数为无符号的,且无符号操作数的级别比有符号操作数高,则将有符号操作数转换为无符号操作数所属的类型。
否则,如果有符号类型可表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属的类型。
否则,将两个操作数都转换为有符号类型的无符号版本。
整型提升:
C++11 将 bool、char、unsigned char、signed char、short 转换为 int。
此外
如果 short 比 int 短,则 unsigned short 类型被转换为 int;
如果两种类型的长度相同,则 unsigned short 类型被转换为 unsigned int 。
(9)若函数原型没有控制参数传递的类型则将float提升为double
(10)强制类型转换使用 long (thorn)/(long) thorn/static_cast<long> (thorn)进行,最后者进行更为严格的转换
(11)默认高阶对低阶的强转是允许的
(12)auto pv=scores.begin()自动将pv的类型设置为与初始值相同<用在类型复杂的情况很方便>
简单练习:
#include <iostream>
using namespace std;
class Pokemon
{
public:
int attack; // 攻击力
int defend; // 防御力
int health_points; // 生命值
int speed; // 速度
int level;//等级
int growth[4];
// 成员函数声明
Pokemon(int atk,int def,int hp,int sp,int level);
//构造的数据为基础值,实际值需要经过子类运算
double get_ce(); //获取战斗力的方法
virtual void level_up()=0; //升级
};
// 成员函数定义
double Pokemon::get_ce()
{
return (attack +defend+health_points/100.0)*(speed/2.0);
}
Pokemon::Pokemon(int atk,int def,int hp,int sp,int lv)
{
attack=atk;
defend=def;
health_points=hp;
speed=sp;
level=lv;
}
class Electical_mouse: public Pokemon
{
public:
int growth[4]={3,1,100,1};
Electical_mouse(int atk,int def,int hp,int sp,int lv) :Pokemon(atk,def,hp,sp,lv)
{
attack+=growth[0]*lv;
defend+=growth[1]*lv;
health_points+=growth[2]*lv;
speed+=growth[3]*lv;
}
int tail_slash(){
return attack*1;
}
void level_up(){
attack+=growth[0]*1;
defend+=growth[1]*1;
health_points+=growth[2]*1;
speed+=growth[3]*1;
}
};
int main(){
Electical_mouse pica=Electical_mouse(30,10,1000,10,50);
cout<<"电老鼠发动了尾切造成了"<<pica.tail_slash()<<"点伤害";
}