编程技术是改变世界的力量。
本站
当前位置:网站首页 > 后端语言 > 正文

C++学习(2)(c++讲解)

gowuye 2024-04-29 16:09 15 浏览 0 评论

对于静态类型语言来说,类型可谓是语言最核心的部分,C++也不例外。

初始化列表

初始化列表(initializer_list)参数由花括号 {} 包裹的参数组成,如

// 求和函数
int sum(initializer_list<int> lst) {
    int total = 0;
    for (auto val : lst) {
        total += val;
    }
    return total;
}

// 函数调用
sum({1, 2, 3, 4, 5});

统一初始化

C++11统一初始化建立在初始化列表之上,编译器在看到初始化列表 initializer_list 后会将其中的参数取出,依次赋值给参数列表,如

class MyClass {
public:
  MyClass(int a, float b) {}
};

MyClass myClass{10, 10.0f};

// 基本类型初始化
int i{1};
double d{1.0};
float f{1.01}; // !Error, double -> float

统一初始化除了多态(基类指针指向子类对象实例),要求值与类型完全匹配,参数不允许出现截断,如不允许使用 int 初始化 char 类型。

类型推导

可能很多程序员都受够了C++标准模板库的迭代器名称,当类型比较复杂时,代码又臭又长,但又无可奈何,如

std::map<std::string, std::vector<std::shared_ptr<MyClass>>>::iterator iter;

C++11中的类型推导可以帮我们解决这些麻烦的输入过程,让编译器自己推导变量的类型,如

auto myiter = mymap.begin();

C++14还加入了返回值类型推导,如

auto add(int a, int b) {
    return a + b;
}

特别注意,auto 关键字会去除引用和 const 限定符,因此需要时必须手动添加,如

const string message = "helle";
const string &getString() {
  return message;
}
// 去除引用和 const 限定符
auto s1 = getString();
s1[0] = 'H';

decltype 关键字用于声明与给定类型相同的类型,且不会修改类型限定符,如

string s1 = "my string";
// 声明与变量 s1 相同的类型
decltype(s1) s2 = "my string 2";

decltype(auto) s2 = getString();
s2[0] = 'H'; // !Error, decltype 不会去除限定符

decltype 关键字在元编程中使用广泛,在此这个章节中不再详细陈述。

类型别名

C++中定义变量,需要先声明其类型,对于一些复杂的类型,可能难以书写和阅读,C++11之前,我们通常使用 typedef 关键字来定义一个类型的别名,如

typedef std::map<int, std::string> MyMap;

C++11中的 using 指令,也可以用来定义类型别名,与 typedef 的效果完全一致,如

// int 指针的别名
using IntPtr = int*;
// vector 别名
using StringVector = std::vector<std::string>;
// 函数指针别名
using MatchFunction = bool (*)(int, int); 
  
// 成员函数指针
using MemberPtr = int (Empolyee::*)() const;
// 成员函数指针赋值
MemberPtr methodPtr = &Empolyee::getName;

// 调用成员函数,需要指定调用的对象
Empolyee empolyee;
(empolyee.*methodPtr)()

既然功能 typedef 与一致,C++11为何要增加 using 别名呢,这是因为 typedef 缺失了一个重要的特性,如上例代码中的 map,如果我们只想指定 key 的类型,让 value 的类型待定,很遗憾,typedef 做不到。

using 可以帮助我们完成这项任务,熟悉C++的小伙伴们可能会觉得眼熟,这个特性和模板的偏特化特别像,如下代码

// 我们指定 key 为 int,让 value 类型待定
template<T> using MyMap = std::map<int, T>; 

// 通过别名定义 std::map<int, std::string> 变量
MyMap<std::string> mymap;

相关推荐

享受优质直播:微软宣布Azure媒体服务预览版
享受优质直播:微软宣布Azure媒体服务预览版

IT之家讯4月14日消息,微软最近在Azure产品上不断有新动作,今天微软宣布了Azure媒体服务预览版,该版本将为内容所有者和提供商加入更多新功能。最近几年...

2024-05-17 12:31 gowuye

Ethscriptions的创新性

根据以太坊的链上记录,Ethscriptions协议是6月14日上线的。而协议上线后大概在6月16日,协议的创始人才正式在推特上公开了这个协议。协议公开后立刻就在海外以太坊社区引发了很大的轰动,但与此...

使用Lily HBase NRT Indexer为HBase构建二级索引
使用Lily HBase NRT Indexer为HBase构建二级索引

使用CDH提供的ClouderaSearch创建二级索引:近实时索引常使用ApacheFlume或ApacheKafka来不断的摄取并索引数据。Lily...

2024-05-17 12:31 gowuye

直播|Apache Hudi 0.11.0 新版本新特性解读
直播|Apache Hudi 0.11.0 新版本新特性解读

ApacheHudi社区在2022年4月30日发布了新版本0.11.0,其中包括了一系列新功能和提升优化。详情可参考:ApacheHudi...

2024-05-17 12:30 gowuye

python调用属性一样调用方法property

python通过property达到像调用属性一样来调用方法。存在两种方式:(1)类属性:在类中定义值为property对象的类属性。(2)装饰器:在方法上应用装饰器@property。1.1p...

python变量封装:@property最终写法

变量的封装只有在有逻辑限制的情况下使用。@property#创建property对象,只负责拦截读取操作@方法名.setter#只负责拦截写入操作属性:@property公开实例变量,缺少逻辑验证,私...

JavaScript-怎么从JavaScript对象中删除一个属性?

要从一个对象中删除一个属性,你可以这样做。deletemyObject.regex;//或者deletemyObject['regex'];//或者,varprop...

c#反射,反射程序员的快乐
c#反射,反射程序员的快乐

1.什么是反射?我们先来看一张图片吧。根据树木的轮廓,我们在水中能得到,一棵一模一样的树木。好的,先带大家简单了解下,那么,再程序中是如何体现呢!反射是.NET...

2024-05-17 12:30 gowuye

Spring IOC容器注解(@Bean 、 @Configuration、@PropertySource)

本节介绍了如何在你的Java代码中使用注解来配置Spring容器。它包括以下主题。基本概念:@Bean和@Configuration通过使用AnnotationConfigApplication...

C#编程语言中,类是面向对象编程(OOP)的核心概念之一

在C#编程语言中,类是面向对象编程(OOP)的核心概念之一。类是创建对象的蓝图或模板,它定义了对象的属性和方法。对象是类的实例,是类的具体表现。以下是关于C#中类的基本概念的一些详细解释:类的定义类是...

小猿圈Python教程之全面解析@property的使用
小猿圈Python教程之全面解析@property的使用

人工智能发展到今天,现在很多程序员也都在学习python技术开发,但是真正会的却不是很多,那么对于小白的话该如何学习python呢?下面小猿圈Python讲师先...

2024-05-17 12:30 gowuye

一文讲清Python 中的 @property 装饰器
一文讲清Python 中的 @property 装饰器

1.引言Python以增强功能的装饰器等功能而闻名。@property装饰器非常出色,它简化了类中的属性访问,并有助于Python的可读性和优雅性。2...

2024-05-17 12:29 gowuye

c#.Net.NetCore面试(十四)面向对象

C#是一种面向对象的编程语言,它支持面向对象编程(Object-OrientedProgramming,OOP)的概念。面向对象编程是一种编程范式,它使用“对象”来设计软件,并通过类和接口来定义...

软件特攻队|Qt中的反射机制之Q_PROPERTY
软件特攻队|Qt中的反射机制之Q_PROPERTY

接触过Java的同学肯定知道“反射”这一神器,而所谓的反射,指的是对于任意的一个类,即使在运行状态下,都能知道这个类的所有方法和属性,并可以动态调用这些方法的一...

2024-05-17 12:29 gowuye

C++类和对象到底是什么意思?
C++类和对象到底是什么意思?

C++是一门面向对象的编程语言,理解C++,首先要理解类(Class)和对象(Object)这两个概念。C++中的类(Class)可以看做C语言中结构体(...

2024-05-17 12:29 gowuye

取消回复欢迎 发表评论: