c++ 11 声明

1. auto

c++11将其用于实现自动类型推断。这要求进行显示初始化,让编译器能够将变量的类型设置为初始值的类型。

auto maton = 112;  // maton is type int

auto pt = &maton; //pt is type int *

double fm(double, int);

auto pf = fm;   //pf is type double (*) (double, int)

关键字auto还可以简化模板声明。 例如,如果i1是一个std::initializer_list<double> 对象, 则可将下述代码:

for (std::initializer_list<double>::iterator p = i1.begin(); p != i1.end(); p++ )

替换为如下代码:

for (auto p = i1.begin(); p != i1.end(); p++)

2.decltype

关键字dectype将变量的类型声明为表达式指定的类型。

decltype(x) y;  //x 是表达式, 该语句让y的类型与x相同。

double x;

int n;

decltype(x*n) q; // q的类型与x*n相同, 为double

decltype(&x) pd; //pd 的类型和&x相同, 为double *

这在定义模板时特别有用, 因为只有等到模板被实例化时才能确定类型:

template <typename T, typename u>

void ef(T t, U u)

{

decltype(T*U) tu;

...

}

tu的类型为T*U的类型, 假定定义了运算T*U, 如果T为char,U为short, 则tu将为int, 这是由整形运算自动执行整型提升导致。

3.模板别名: using = 

对于冗长或复杂的标识符,如果能够创建其别名将很方便。 以前,c++为此提供了 typedef;

typedef  std::vector<std::string>::iterator;

c++11提供了另一种创建别名的语法:

using  itType = std::vector<std::string>iterator;

差别在于, 新语法可以用于模板部分具体化,但typedef不能:

template<typename  T>

using arr12 = std::array<T,12>;

上述
语句具体化模板 array<T, int>, 例如:

std::array<double, 12>  a1;

std::array<std::string, 12> a2;

可将他们替换为如下声明:

arr12<double> a1;

arr12<std::string> a2;

4. nullptr

空指针是不会指向有效数据的指针。c++11新增了关键字nullptr, 用于表示空指针, 它是指针类型, 不能转换为整数类型。 为向后兼容c++11仍允许使用0来表示空指针, 因此表达式 nullptr == 0 为true, 但使用nullptr而不是0提供了更高的类型安全。 例如, 可将0传递给接受int 参数的函数, 但如果你试图将nullptr传递给这样的函数, 编译器将此视为错误。
因此, 出于清晰和安全考虑, 请使用nullptr ——— 如果编译器支持它。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 00:37:18

c++ 11 声明的相关文章

C++11 并发指南------std::thread 详解

参考: https://github.com/forhappy/Cplusplus-Concurrency-In-Practice/blob/master/zh/chapter3-Thread/Introduction-to-Thread.md#stdthread-%E8%AF%A6%E8%A7%A3 本节将详细介绍 std::thread 的用法. std::thread 在 <thread> 头文件中声明,因此使用 std::thread 需包含 <thread> 头文件. &

JSP中的声明语句块和表达式块

一.JSP中的声明语句块 在JSP页面中使用<%!%>括起来的部分,称为声明语句块.声明语句块中的内容,将被JSP引擎翻译到Servlet的类体中,是不会被包含到某个方法中的. 这样的话,在JSP的声明语句块中就可以声明实例变量.实例方法.静态方法.静态代码块等内容.并且,这些内容均可被JSP的的Java代码块中的代码访问.因为可以访问类属性的.不过,还是不建议在JSP的声明语句块中声明实例变量.因为JSP是运行在单例多线程环境下的,实例变量将会引起线程安全问题. 需要注意的是,在JSP的声明

未排序数组中累加和为指定值得最长子数组序列问题

1.题目: 给定一个无序数组,其中元素 可正可负可0,给定一个k,求arr中所有的子数组累加和为k的最长子数组长度. 1 // maxLength.cpp : 定义控制台应用程序的入口点. 2 //未排序数组中累加和为指定值的最长子数组长度 3 //数组元素可正.可负.可0 4 5 #include "stdafx.h" 6 #include<iostream> 7 #include <map> 8 #include <iterator> 9 10

Swift 数组、字符串、集合与字典详解

今天我们来看几个最基本的数据结构:数组,字符串,集合和字典. 数组 数组是最基本的数据结构.Swift编程语言中改变了以前Objective-C时代NSMutableArray和NSArray分开的做法,统一到了Array唯一的数据结构.下面是最基本的一些实现. 1 2 3 4 5 6 7 8 9 10 11 // 声明一个不可修改的数组 let nums = [1, 2, 3] let nums = [Int](count: 5, repeatedValue: 0) // 声明一个可以修改的数

Google C++编程风格指南

一.头文件 1. #define的保护:所有头文件都应该使用#define防止头文件被多重包含(multiple inclusion),命名格式: <PROJECT>_<PATH>_<FILE>_H_ 为保证唯一性,头文件的命名应基于其所在项目源代码树的全路径. 2.头文件依赖:使用前置声明(forward declarations)尽量减少.h文件中#include的数量.避免多米诺骨牌效应 e.g.头文件中用到类File,但不需要访问File的声明,则头文件只需前置

全面理解面向对象的JavaScript

转载:http://justcoding.iteye.com/blog/2019293 原文:http://www.ibm.com/developerworks/cn/web/1304_zengyz_jsoo/index.html?ca=drs-#major6 前言 当今 JavaScript 大行其道,各种应用对其依赖日深.web 程序员已逐渐习惯使用各种优秀的 JavaScript 框架快速开发 Web 应用,从而忽略了对原生 JavaScript 的学习和深入理解.所以,经常出现的情况是,

深入解析String.intern()方法

转载: http://tech.meituan.com/in_depth_understanding_string_intern.html 引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存. 8种基本类型的常量池都是系统协调的,String类型的常量池比较特殊.它的主要使用方法有两种: 直接使用双引号声明出来的String对象会直接存储在常量池中. 如

数据结构之——选择排序

选择排序的基本思想为:每一趟(例如第i趟)在后面的n-i+1(i=1,2,3,…...,n-1)个待排序元素中选取关键字最小的元素,作为有序序列的第i个元素,直到n-1趟做完,待排序元素只剩下一个,就不用选了,序列也排序完毕.选择排序主要有简单选择排序和堆排序,下面分别就这两种排序算法进行讨论. 1.简单选择排序 从上面选择排序的思想中可以很直观的得出简单选择排序的算法思想:假设排序列表为L[1……n],第i趟排序从L[i……n]中选择关键字最小的元素与L(i)交换,每一趟排序可以确定一个元素的

多线程程序设计学习(5)balking模式和timed模式

Balking[返回模式]一:balking pattern的参与者--->GuardedObject(被警戒的对象) --->该模式的角色:模拟修改警戒对象的线程,当警戒条件达到执行具体操作的线程,参与者(被警戒的参与者) 二:balking pattern模式什么时候使用--->不需要刻意去执行什么操作的时候(比如说自动保存)--->不想等待警戒条件成立时.(不让线程休息)--->警戒条件只有第一次成立时候. 三:balking pattern思考--->balki