【C/C++】成员变量

问题1:

哪一种成员变量可以在同一个类的实例之间共享?

问题2:

指出下面程序的错误。如果把静态成员数据设为私有,该如何访问?

#include <iostream>
using namespace std; 

class Cat
{
	public:
		Cat(int age):itsAge(age) { HowManyCats++; }
		virtual ~Cat() { HowManyCats--; }
		virtual int GetAge() { return itsAge; }
		virtual void SetAge(int age) { itsAge = age; }
		static int HowManyCats; 
	private:
		int itsAge; 
}; 

int main()
{
	const int MaxCats = 5; 
	int i = 1; 
	Cat *CatHouse[MaxCats]; 
	for (i = 0; i < MaxCats; i++) 
		CatHouse[i] = new Cat(i); 
	for (i = 0; i < MaxCats; i++)
	{
		cout << "There are "; 
		cout << Cat::HowManyCats; 
		cout << " cats left!\n"; 
		cout << "Deleting the one which is "; 
		cout << CatHouse[i]->GetAge(); ;
		cout << " years old\n"; 
		delete CatHouse[i]; 
		CatHouse[i] = 0; 
	}
	return 0; 
}

问题3:

请问下面程序打印出的结果是什么?

#include <iostream>
#include <string>
using namespace std; 

class base 
{
	private :
		int m_i; 
		int m_j; 
	public :
		base(int i) : m_j(i), m_i(m_j) {}
		base() : m_j(0), m_i(m_j) {}
		int get_i() { return m_i; }
		int get_j() { return m_j; }
}; 

int main(int argc, char* argv[]) 
{
	base obj(98); 
	cout << obj.get_i() << endl << obj.get_j() << endl; 
	return 0; 
}

问题4:

这个类声明正确吗?为什么?

class A
{
	const int Size = 9; 
}

=======================================================================================

问题1答案:必须使用静态成员变量在一个类的所有实例间共享数据。如果想限制对静态成员变量的访问,则必须把它们声明为保护型或私有型。不允许用静态成员变量去存放某个对象的数据。静态成员数据是在这个类的所有对象间共享的。

问题2答案:该程序错在设定了静态成员变量,却没有给静态成员变量赋初值。如果把静态成员数据设为私有,可以通过公有静态成员函数访问。

#include <iostream>
using namespace std; 

class Cat
{
	public:
		Cat(int age):itsAge(age) { HowManyCats++; }
		virtual ~Cat() { HowManyCats--; }
		virtual int GetAge() { return itsAge; }
		virtual void SetAge(int age) { itsAge = age; }
		static int GetHowMany() { return HowManyCats; }
		// static int HowManyCats;
	private:
		int itsAge; 
		static int HowManyCats;
}; 

int Cat::HowManyCats = 0; 

void tele(); 

int main()
{
	const int MaxCats = 5; 
	int i = 1; 
	Cat *CatHouse[MaxCats]; 
	for (i = 0; i < MaxCats; i++) 
		CatHouse[i] = new Cat(i); 
	for (i = 0; i < MaxCats; i++)
	{
		delete CatHouse[i]; 
		tele(); 
	}
	return 0; 
}

void tele() 
{
	cout << "There are " << Cat::GetHowMany() << " Cats alive!\n"; 
}
问题3解析:

本题想要得到的结果是“98,98”。但是成员变量的声明先是m_i,然后是m_j;初始化列表的初始化变量顺序是根据成员变量的声明顺序来执行的,因此m_i会被赋予一个随机值。更改一下成员变量的声明顺序可以得到预想的结果。如果要得到“98,98”的输出结果,程序需要修改如下:

#include <iostream>
#include <string>
using namespace std; 

class base 
{
	private :
		int m_j;	// 修改成员变量声明顺序
		int m_i; 
		 
	public :
		base(int i) : m_j(i), m_i(m_j) {}
		base() : m_j(0), m_i(m_j) {}
		int get_i() { return m_i; }
		int get_j() { return m_j; }
}; 

int main(int argc, char* argv[]) 
{
	base obj(98); 
	cout << obj.get_i() << endl << obj.get_j() << endl; 
	return 0; 
}
答案:输出结果第一个为随机数,第二个是98。

问题4解析:

这道程序题存在着成员变量问题。常量必须在构造函数的初始化列表里面初始化或者将其设置为static。

答案:

正确的程序如下:

class A 
{
	A()
	{
		const int Size = 9; 
	}
}; 
或者:

class A 
{
	static const int Size = 9; 
};

此外,还可以使用枚举来定义常量 。

<think>我们正在配置VSCode的C/C++变量语法高亮显示。这通常不需要额外的编译器,而是通过VSCode的语法高亮机制实现。不过,为了确保C/C++语言支持,我们需要安装C/C++扩展。同时,高亮显示可以通过设置颜色主题或自定义语法高亮规则来实现。 根据引用[1]和[2],我们知道需要安装C/C++插件。此外,引用[3]提到VSCode本身是一个高级编辑器,需要编译器来编译代码,但语法高亮是编辑器本身的功能,由语言扩展提供。 步骤: 1. 确保已经安装了VSCode的C/C++扩展(如果没有,请安装并重启VSCode)。 2. 选择一个支持C/C++语法高亮的主题(VSCode自带多种主题,也可以从市场安装更多主题)。 3. 如果对默认的高亮不满意,可以自定义编辑器的token颜色(即语法高亮规则)。 具体操作: - 安装C/C++扩展:在扩展商店中搜索“C/C++”,安装Microsoft提供的版本。 - 更换主题:通过“文件”->“首选项”->“主题”->“颜色主题”来更换,选择你喜欢的主题。 - 自定义高亮:通过修改设置中的editor.tokenColorCustomizations来调整特定token的颜色。 例如,在settings.json中添加如下设置可以自定义变量的颜色: ```json { "editor.tokenColorCustomizations": { "textMateRules": [ { "scope": "variable", "settings": { "foreground": "#FF0000" // 将变量设置为红色 } } ] } } ``` 这里的"scope"可以是具体的语法作用域,比如"variable"表示变量。C/C++语言中,不同的语法元素(如函数、类、变量等)有不同的作用域。我们可以通过Developer: Inspect Editor Tokens and Scopes命令(在命令面板中搜索)来查看当前光标处token的作用域。 操作步骤: 1. 打开一个C/C++文件。 2. 按Ctrl+Shift+P打开命令面板,输入“Developer: Inspect Editor Tokens and Scopes”并执行。 3. 将鼠标放在代码中的变量上,会显示该token的语法作用域信息。例如,变量可能的作用域是“variable.other.cpp”等。 然后,我们可以根据这个作用域来设置更精确的规则。例如: ```json { "editor.tokenColorCustomizations": { "textMateRules": [ { "scope": "variable.other.cpp", "settings": { "foreground": "#FF0000" } } ] } } ``` 注意:修改settings.json后保存即可生效,无需重启。 所以,配置变量高亮显示的主要步骤是安装C/C++扩展,然后通过主题或自定义token颜色来实现。 相关问题: 1. 如何查看VSCode中代码token的语法作用域? 2. 除了变量,VSCode中还可以自定义哪些语法元素的高亮颜色? 3. 如何安装并使用VSCode的主题扩展来改变代码高亮?</think>### 在VSCode中配置C/C++变量语法高亮显示的方法 在VSCode中配置C/C++变量语法高亮显示,主要涉及以下步骤: #### 1. 安装C/C++扩展(必需) 首先确保已安装Microsoft官方的C/C++扩展: - 打开VSCode扩展市场(`Ctrl+Shift+X`) - 搜索安装 **"C/C++"**(由Microsoft提供) - 安装后重启VSCode生效[^1][^2] #### 2. 启用语义高亮(核心设置) C/C++扩展提供语义高亮功能,需手动启用: 1. 按 `Ctrl+,` 打开设置 2. 搜索 `C_Cpp: Semantic Highlighting` 3. 选择 `Enabled` 并勾选子选项: ```json "C_Cpp.semanticHighlighting.enabled": true, "C_Cpp.semanticHighlighting.variables": true ``` #### 3. 自定义变量颜色(可选) 如需修改变量高亮颜色: 1. 创建/修改 `.vscode/settings.json` 文件 2. 添加颜色规则(示例): ```json { "editor.tokenColorCustomizations": { "textMateRules": [ { "scope": "variable", "settings": { "foreground": "#FF5733" } // 橙色变量 }, { "scope": "variable.parameter", // 函数参数 "settings": { "foreground": "#75FF33" } } ] } } ``` #### 4. 使用作用域查看器(调试工具) 精确确定变量作用域: 1. 打开命令面板(`Ctrl+Shift+P`) 2. 输入并执行 **"Developer: Inspect Editor Tokens and Scopes"** 3. 点击代码中的变量,查看其作用域名称(如 `variable.other.cpp`) #### 5. 主题适配建议 - 推荐使用专为C++优化的主题(如 **"C++ Themes Pack"**) - 或安装 **"One Dark Pro"** 等支持语义高亮的流行主题 > ⚠️ 注意:高亮效果需要语言服务支持,确保文件保存为 `.c` 或 `.cpp` 后缀[^3]。 --- ### 相关问题 1. 如何为特定类型的变量(如全局变量/局部变量)设置不同的高亮颜色? 2. VSCode中C/C++扩展的语义高亮与基本语法高亮有何区别? 3. 为什么配置后变量高亮不生效?常见排查步骤有哪些? 4. 如何为C++成员变量创建独立的高亮规则? 5. VSCode有哪些优秀的C++主题扩展推荐? [^1]: VScode配置C/C++开发环境,安装/环境配置/编译/调试/汉化/编码问题 [^2]: VSCode配置C/C++环境 [^3]: VScode搭建C/C++开发环境
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值