Effective Modern C++[实践]->优先使用 scoped enums,而非 unscoped enums

本文详细介绍了C++中的两种枚举类型:unscoped enum 和 scoped enum。解释了它们的特点、用法及区别,并通过示例代码展示了如何使用这两种枚举类型。

  • C++98 风格的枚举,现在称作为 unscoped enum
  • scoped enum 的枚举元素只在 enum 内可见, 元素只能强制转换成其他类型。
  • scoped enum unscoped enum 都可以指定潜在类型。 scoped enum 默认是 intunscoped enum 没有默认类型。
  • scoped enum 总是能前置声明,unscoped enum 只有指定了潜在类型, 才可以前置声明。

枚举

枚举(enumeration)是独立的类型,它的值被限制在一个取值范围内,它可以包含数个明确命名的常量(“枚举项(enumerator)”)。各常量的值是某个整型类型(称为该枚举的底层类型(underlying type))的值。

有两种截然不同的枚举:unscoped enum(以 枚举关键词 enum 声明)和scoped enum(以 枚举关键词 enum class 或 enum struct 声明)。

unscoped enum

简要说明

enum 名字(可选) { 枚举项 = 常量表达式 , 枚举项 = 常量表达式 , … }

enum Color {
   
    red, green, blue };

enum 名字(可选) : 类型 { 枚举项 = 常量表达式 , 枚举项 = 常量表达式 , … } (C++11 起)

enum Color:int {
   
    red, green, blue };

enum 名字 : 类型 ; (C++11 起) 前置声明

enum Color:int;

知识点位

多个enum名称或元素可以有相同的值

下面是两个具有相似值的enum元素的示例。

#include <iostream>
using namespace std;

enum Cars{
   
   Jeep = 1, BMW = 0, Mercedes_Benz = 0};
int main(){
   
   
  	cout<<"Jeep= "<<Jeep<<"   BMW= "<<BMW<<"  Benz= "<<Mercedes_Benz;
    return 0;
}

默认从0开始

如果不给enum元素赋自定义值,编译器会给它们赋从0开始的默认值。

#include <iostream>
using namespace std;

enum Months{
   
   January, February, March, April, May, June, July, August, September, October, November, December};
int main(){
   
   
    enum Months m = May;
    cout<< "以月份为单位的五月的值为 "<< m;
    return 0;
}

未赋值的前项+1

可以以任何顺序为enum中的任何元素提供值。所有未赋值的元素将获得先前的+ 1值。

#include <iostream>
using namespace std;

enum weekdays {
   
   
    Sunday,
    Monday = 2,
    Tuesday,
    Wednesday = 6,
    Thursday,
    Friday = 9,
    Saturday = 12
};
int main(){
   
   
    cout << "Sunday 值=" << Sunday << "  Tuesday的值 = " <
<think>根据提供的引用内容,我们将分析App.vue文件中template注释、script标签和style标签代码的含义和作用。 ### 1. template部分 - **含义**:在Vue组件中,`<template>`标签用于定义组件的HTML结构。它包含页面的DOM结构和Vue指令(如v-if, v-for等)。 - **作用**: - 构建页面结构:作为组件的模板,定义用户界面。 - 支持Vue的模板语法:可以绑定数据、使用指令等,实现动态渲染。 - 注释内容:在开发阶段,注释掉部分模板内容可以临时移除某些元素而不删除代码,常用于调试或快速切换页面布局(如引用[3]中清空原始页面的操作)。 - 示例:引用[1]中的`<template>`包含一个`<div>`容器,其中包含一个logo图片和`<router-view>`(用于渲染路由对应的组件)。 ### 2. script部分 - **含义**:`<script>`标签包含组件的JavaScript逻辑,通常导出Vue组件选项对象或使用Composition API的逻辑。 - **作用**: - 定义组件行为:包括数据(data)、计算属性(computed)、方法(methods)、生命周期钩子(created, mounted等)等。 - 导出组件:通过`export default`导出组件对象,使其可被其他组件导入和使用- 注册子组件:在`components`属性中注册当前组件需要使用的子组件。 - 示例:引用[1]中`<script>`部分简单导出了组件名为'App';引用[3]提到在App.vue中引入子组件并放置到`<template>`中。 ### 3. style部分 - **含义**:`<style>`标签用于定义组件的CSS样式。 - **作用**: - 限定样式作用域:通过`scoped`属性(如`<style scoped>`)可以使样式仅作用于当前组件,避免全局污染。 - 支持预处理器:可通过`lang`属性指定CSS预处理器(如`lang="less"`,见引用[1]),增强CSS编写能力。 - 组件样式隔离:为当前组件提供私有样式,确保样式不影响其他组件。 - 示例:引用[1]中的`<style lang="less">`定义了`#app`和`.img`的样式。 ### 综合分析 在App.vue中: - **template注释**:常用于临时隐藏部分UI(如清空初始页面内容),便于调试或重构(引用[3])。 - **script标签**:定义根组件的逻辑,管理全局状态(如通过Vuex)或处理路由(如引用[1]中的`<router-view>`)。 - **style标签**:设置全局或局部样式(App.vue通常包含全局基础样式,但也可以使用`scoped`限制范围)。 ### 注意事项 - **组件化设计**:App.vue作为入口文件,应保持简洁,主要承担整体布局和路由渲染,具体功能应拆分为子组件(引用[3])。 - **样式管理**:在大型项目中,App.vue的样式通常只包含全局样式,组件私有样式应写在各自组件的`<style>`中。 §§相关问题§§ 1. 在Vue项目中,如何正确使用`scoped`样式避免全局污染? 2. App.vue中`<router-view>`的作用是什么?如何配置路由? 3. 如何在Vue组件中高效地使用注释进行调试? </think>### App.vue 文件结构分析 基于引用内容,`App.vue` 作为 Vue 项目的入口文件,其核心结构包含三部分:`<template>`、`<script>` 和 `<style>`。以下针对各部分的注释、标签含义及作用进行详细分析: --- #### 1. **`<template>` 部分** ```vue <template> <!-- 注释内容 --> <div id="app"> <img class="img" src="./assets/logo.png"> <router-view/> </div> </template> ``` - **含义**: 定义组件的 HTML 模板结构,决定页面渲染内容。 - **作用**: - **页面入口**:所有页面组件在此容器内切换渲染(通过 `<router-view>` 实现路由视图渲染)[^1][^3]。 - **注释用途**:临时禁用部分 UI(如清空初始页面),便于调试或重构(引用[3]示例)。 - **子组件集成**:通过 `<MyComponent/>` 等标签复用子组件逻辑与视图[^3]。 - **注意事项**: 若出现 `<template>` 标签报错(如 VSCode 中),可能是编辑器插件(如 Vetur)配置问题,需检查校验规则[^4]。 --- #### 2. **`<script>` 部分** ```vue <script> export default { name: 'App' // 组件名称 } </script> ``` - **含义**: 包含组件的 JavaScript 逻辑,管理数据、方法及生命周期钩子。 - **作用**: - **组件注册**:通过 `export default` 导出组件对象,供 Vue 实例全局调用[^1][^3]。 - **数据与逻辑控制**:定义 `data()`、`methods` 等属性,驱动模板动态渲染(如引用[2]的代码模板)。 - **子组件管理**:可在此引入子组件(需在 `components` 字段注册)并传递数据[^3]。 - **扩展场景**: 复杂项目可能包含路由配置、状态管理(Vuex)等逻辑。 --- #### 3. **`<style>` 部分** ```vue <style lang="less" scoped> #app { font-family: 'Avenir', Helvetica, Arial, sans-serif; .img { width: 200px; } } </style> ``` - **含义**: 定义组件的 CSS 样式,支持预处理器(如 `lang="less"`)。 - **作用**: - **样式隔离**:`scoped` 属性使样式仅作用于当前组件,避免全局污染[^1][^3]。 - **定制化 UI**:控制布局(如居中、边距)和元素样式(如图片尺寸)。 - **预处理器支持**:使用 Less/Sass 增强样式编写效率(如嵌套语法 `.img {...}`)。 --- ### 总结:App.vue 的核心功能 | 部分 | 核心作用 | 典型场景示例 | |---------------|--------------------------------------------------------------------------|----------------------------------| | `<template>` | 定义页面结构,集成子组件与路由视图 | 通过 `<router-view>` 切换页面 | | `<script>` | 管理组件逻辑、数据及子组件注册 | 导出组件,定义数据/方法 | | `<style>` | 封装组件私有样式,支持 CSS 预处理器 | 添加 `scoped` 限定样式作用域 | > **关键设计原则**: > - **复用性**:通过子组件拆分功能(如 `<MyComponent/>`),提升代码可维护性[^3]。 > - **模块化**:各标签职责分离(视图/逻辑/样式),符合 Vue 组件化开发规范[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-西门吹雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值