1.7、懒狗继续学习
P12、if语句
汇编指令视图:在debug模式下,运行到断点之后可以右键代码区->转到反汇编(Go To Disassembly)
const char* ptr 可以与字符串直接判等 如:if ( ptr==“hello” )
P13、Visual Studio的最佳设置
过滤视图和磁盘目录结构:
- VS中解决方案下的文件夹是虚拟的,起一个过滤的作用,但在磁盘上不存在
- 通过点击显示所有文件,解决方案下的文件树会变成磁盘的实际样子。
- 在此视图下新建文件夹就可以了
- 解决方案属性里面设置的路径都是基于项目文件vcsproj来说的
- 这里所作配置:
- 解决方案属性->平台选择所有平台->常规里输出目录设置为
$(SolutionDir)\bin\$(Platform)\$(Configuration)\
- 中间目录设置为
$(SolutionDir)\bin\intermediates\$(Platform)\$(Configuration)\
- 解决方案属性->平台选择所有平台->常规里输出目录设置为
P14、C++循环(for 、while)
没什么东西
P15、C++控制流语句(continue, break, return)
没什么东西
P16、C++指针
C++11关键字nullptr
在debug模式下,运行到断点之后可以查看内存视图,也可以查看特定内存地址的方法:
- 菜单栏 调试->窗口->内存
P17、C++引用
引用通常只是指针的伪装。
引用必须去“引用”已经存在的变量,引用本身不是新的变量,引用并不占用内存,没有真正的存储空间。
别名。声明时赋值
P18、C++类
数据和功能组合在一起的一种方法。
没什么东西
1.11、一天打渔,三天晒网
P19、C++类与结构体对比
主要区别:可见度 visiablity
- class 默认是private;而struct默认是public
C++中的struct主要是为了兼容C
P20、如何写一个C++类
日志类为例:
日志信息的三个级别:error、warning、message/trace
日志系统级别:error、warning、message/trace,设置之后起信息过滤的作用。
#include<iostream>
//命名习惯和类内分块习惯
class Log
{
public:
const int LogLevelError = 0;
const int LogLevelWarning = 1;
const int LogLevelInfo = 2;
private:
int m_LogLevel = LogLevelInfo;
public:
void SetLogLevel(int LogLevel)
{
m_LogLevel = LogLevel;
}
void Warning(const char* message)
{
if (m_LogLevel >= LogLevelWarning)
std::cout << "[Warning]: " << message << std::endl;
}
void Error(const char* message)
{
if (m_LogLevel >= LogLevelError)
std::cout << "[Error]: " << message << std::endl;
}
void Info(const char* message)
{
if (m_LogLevel >= LogLevelInfo)
std::cout << "[Info]: " << message << std::endl;
}
};
int main() {
Log log;
log.SetLogLevel(log.LogLevelWarning);
log.Info("hello");
log.Error("hello");
log.Warning("hello");
std::cin.get();
}
P21、C++中的静态(static)
含义:
- 在类或结构体外部使用static关键字:
- static修饰的符号(变量/函数),只在内部链接,该符号只在翻译单元可见
- 在类或结构体内部使用static关键字:
- static修饰的变量与类的所有实例共享内存(单例)
讨论在类或结构体外部使用static关键字:
- 如两个.cpp都有一个全局变量
int s_varible;
,链接阶段会报错:already defined。- 将其中一个cpp修饰
static int s_varible;
,链接阶段不会报错- static的作用类似于private
- 或者将其中一个cpp修饰
extern int s_varible;
,意为在外部翻译单元中寻找s_varible;【external linking】- 此时没有extern修饰的
int s_varible;
才是本体。
- 此时没有extern修饰的
- 将其中一个cpp修饰
P22、C++类和结构体中的静态(static)
由于单例的特性,静态方法无法访问类的实例。
静态方法可以通过类名被调用,在静态方法内部,不能写引用到类实例的代码。
P23、C++中的局部静态(Local Static)
生存期指的是变量实际存在的时间;作用域指我们可以访问变量的范围;
Local Static允许我们声明一个变量,它的生存期基本相当于整个程序的生存期,然而它的作用范围被限制在这个作用域(函数、if等)内。
函数作用域中的static和类作用域中的static之间的对比:
- 生存周期相同
- 在类的作用域中,类中任何东西都可以访问这个静态变量;
- 在函数作用域中声明一个静态变量,它将是函数的局部变量。
#include<iostream>
//不使用局部静态的一种单例实现(饿汉)
class Singleton
{
private:
static Singleton* s_Instance;
public:
static Singleton& Get() { return *s_Instance; }
void Hello() {}
};
Singleton* Singleton::s_Instance = nullptr;
int main() {
Singleton::Get().Hello();
std::cin.get();
}
#include<iostream>
//使用局部静态的一种单例实现(懒汉)
class Singleton
{
public:
static Singleton& Get()
{
static Singleton instance;
return instance;
}
void Hello() {}
};
int main() {
Singleton::Get().Hello();
std::cin.get();
}
P24、C++枚举
注意语法和特性
enum Example : unsigned char
{
A = 5, B, C
};
#include<iostream>
//使用枚举优化P20代码,注意枚举不是一个作用域
class Log
{
public:
//const int LogLevelError = 0;
//const int LogLevelWarning = 1;
//const int LogLevelInfo = 2;
//修改部分***
enum Level
{
LogLevelError = 0, LogLevelWarning, LogLevelInfo
};
//修改部分***
private:
int m_LogLevel = LogLevelInfo;
public:
void SetLogLevel(int LogLevel)
{
m_LogLevel = LogLevel;
}
void Warning(const char* message)
{
if (m_LogLevel >= LogLevelWarning)
std::cout << "[Warning]: " << message << std::endl;
}
void Error(const char* message)
{
if (m_LogLevel >= LogLevelError)
std::cout << "[Error]: " << message << std::endl;
}
void Info(const char* message)
{
if (m_LogLevel >= LogLevelInfo)
std::cout << "[Info]: " << message << std::endl;
}
};
int main() {
Log log;
log.SetLogLevel(log.LogLevelWarning);
log.Info("hello");
log.Error("hello");
log.Warning("hello");
std::cin.get();
}
P25、C++构造函数
Java类中的变量会被默认赋默认值,而C++不会
删除默认构造函数可以声明private的构造函数 or Entity = delete;
P26、C++析构函数
主动调用析构函数并不会释放资源(删除当前对象)。