Cherno CPP学习笔记-02-基础语法

发布于:2024-04-14 ⋅ 阅读:(155) ⋅ 点赞:(0)

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;才是本体。

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++析构函数

主动调用析构函数并不会释放资源(删除当前对象)。


网站公告

今日签到

点亮在社区的每一天
去签到