强制输出的数字以小数形式
在 cout << "变量" << endl;之前加 cout << fixed;
控制显示精度
cout
<< setprecision(精度);(需要引用头文件 include<iomanip>)
以上代码可以结合使用:cout
<< fixed << setprecision(精度);(作用范围是全局)
flost不适合显示位数大的数字,不会四舍五入。
排版,对齐
cout << setw(宽度) << "|" <<
"\" << endl;其中 setw()是设置后面的符号距离左面的距离,"\"不会影响。
左对齐:
在cout << setw(宽度) << "|" <<
"\" << endl;上一行加入cout
<< left;
填充:cout <<
setfill('_');
测量数据类型长度
sizeof(数据类型):用来测量数据类型的长度。
修改控制台标题
#include<windows.h>
setconsoleTitle("");
文档注释
/** 注释 */ 提示会有文字注释
{
/** 攻击力 */
double attack = 10;
}
判断真假
布尔类型:true表示真,false表示假
在输出之前写:cout <<
boolalpha; 强制以true或false来代替0或非零
逻辑运算符
&& 与(并且) 两个条件同时为真,结果为真。
|| 或 两个条件有一个为真,结果为真。
! 非 条件为假,结果为真。条件为真,结果为假。
位(bit)运算符
需要先转换为二进制进行运算。
& 按位与 两个操作数同时为1,结果为1。
| 按位或 两个操作数有一个位1,结果为1。
~ 按位非 操作数位1,结果为0。
^ 按位异或 两个操作数相同,结果为0。
<< 左移 右侧空位补0。
>> 右移 左侧空位补符号位。
定义常亮
const int N = 100;
测量长度
cout << "数组的大小" << sizeof(nums)
/ sizeof(int) << "个数组元素" << endl;
只能针对基本类型
类
定义
class 类名
{
};
声明对象
CPeople op;
CPeople* op1 = new CPeople;
成员调用
栈区普通对象: 对象.成员 : op.Test();
堆区指针对象:对象->成员:
op1->Test(); delete op1;
类的所有成员(个别特殊static),必须通过对象访问
访问修饰符
private
类内可见
类内不写访问修饰符,默认是private
protected
类内以及子类可见
public使用private成员使用private成员
类外可见
c++的结构体,默认是public
作用范围
书写位置开始,一直到下个修饰符,或者类结尾的花括号 }
拓展功能
作为类内成员分类的工具,这个,修饰符,写多少都行
安全性
友元函数
friend void fun(); 需要声明
friend int main(); 不需 要声明
使用protected成员有两种方法:继承和友元
使用private成员 :友元
特点
不受访问修饰符影响
可以有多个友元
缺点:破坏了类的封装性,不是迫不得已,不要用
函数成员
构造函数
作用
对数据成员赋初始值。
形式
类名(参数列表){} 无返回值
调用
对象定义的时候:
栈区对象:直接调用
堆区对象:声明指针并不会调用构造函数,new空间的时候调用
类型
默认构造函数:
什么都不做,即空的
只要声明了一个构造函数,默认的就没有了
有参数的构造函数:
通过对象传递
可以指定默认值
多个构造函数构成重载
成员函数定义
类内定义
类外:
类内声明:意义是用于多文件
类外定义
初始化列表
初始化与赋值的区别:
意义上:初始化是一个变量或者对象产生之时就赋予一个初始值,伴随性质
赋值是一个变量或者对象产生之后的任意时刻可以赋予一个值,随意性质
宏观代码上:
基本数据类型:作用相同
数组,结构体:初始化,和赋值的形式不同。作用相同
引用,const:只能初始化不能赋值
形式:
构造函数之后加个冒号:a(1),b(2)
不是花括号之后
作用:
跟构造函数的区别:基本数据类型,用哪个都行,引用或const必须用初始化列表
对数据成员进行初始化:
1、可通过数值对数据成员初始化
2、可通过构造函数参数对数据成员进行初始化
3、可通过成员之间相互初始化,成员初始化的顺序
执行顺序:
在构造函数之前
引用和const:
引用
引用成员
引用参数
引用类外
const
参数
常量
注意点:
多个构造函数,初始化列表绑定所在的构造函数
数组和结构体如何使用初始化列表:
数组:
CStu()
: arr()
vc无效果
vs有效果
通常设置设置数组元素全为0的方法
memset
for循环
结构体:
可直接赋值
用初始化列表反而增加了复杂性
析构函数
作用:
清理工作
比如我们用new给成员申请了空间,析构函数内可以释放掉
调用时间决定了他的主要作用
形式:
~类名()
只有一个,没有参数
没有重载
默认析构函数
什么都不做,默认构造函数
调用:
对象声明周期结束时,自动调用
1、局部对象
2、临时对象:作用域是所在语句
3、指针对象:delete
4、默认
malloc 和 new的区别:
new会触发构造函数,malloc不会
free 和delete区别:
delete会触发析构函数,free不会
常函数
形式
void
fun() const {;}
构造和析构 不可以是常函数
特点
可以使用数据成员,不能修改数据成员,对函数的功能有更明确的限定
常函数的this指针是 const CStu*
常对象只能调用常函数,不能调用普通函数
static
形式
static int a;
static void fun(){}
静态成员
静态常量整型数据成员可以直接进行初始化
static
const float a = 13.12f; 不行
static
const int a = 13.12f; 整形
静态成员函数
1、无this
2、不能调用成员成员,可以调用静态成员
3、可以作为一种指挥该类所有对象的作用
4、他是属于类的属性,不是对象,即所有对象共有一个可以通过类名调用
可以通过对象调用
拷贝构造/复制构造:copy
形式
CStu(const CStu&)
本质即构造函数
参数是本类的常引用
何时调用
1、新建一个对象,并将其初始化为同类现有对象
CStu
a; 声明一个对象
CStu
a1(a);
CStu
a2 = a;
CStu
a3 = CStu(a);
CStu*
a4 = new CStu(a);
赋值不会的CStu s;CStu p;s = p;
2、当程序生成对象副本时
函数参数传递对象的值
函数返回对象
有何功能
默认的复制构造函数,逐个复制非静态成员(成员的复制成为浅复制)值,复制的是成员的值
系统默认的这个又叫浅拷贝
同一个类的多个对象,内存排布是一样的,地址不同
深拷贝
指针成员不能直接赋值,要用内存拷贝,memcpy,strcpyd等
拷贝构造所引发的指针成员二次释放崩溃的问题的方式
深拷贝
传地址
传引用
数据成员
相对特殊
引用成员
初始化列表初始化
const成员
初始化列表初始化
静态成员
类外初始化
无this指针
静态常量成员
可在类内直接初始化
也可在类外初始化
指针成员
注意拷贝构造产生的问题
this
1、作用:区分同名的,是指向当前对象的指针,所以我们可以通过指针,访问成员
2、对象创建的时候才有的
3、类型:对应对象的类的指针类型
4、this指针不是成员
5、this作用域是在类内部,系统默认传递给函数(非静态函数)的隐含参数