CPP.1新加特性

1.引用

数据类型 & 引用名 = 初始值(变量名)

2.const

.1常量

const 类型 变量名

const int var = 10;

.2常量引用

const 类型& 引用名

int var;

const int & ref_var = var; //不能对ref_var进行修改

.3常量对象

类名 const 对象名

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

const string str_obj = "qwq";//定义时初始化 以后不能修改

.4常量成员函数

类名::函数名(形参表)const

class MyClass
{
public:
    MyClass() {};
    ~MyClass() {};
    int get_x(void)const;//只负责返回类x的值 并不修改成员的值 所以加const

private:
    int x;
};

int MyClass::get_x(void)const
{
    return x;
}

如果对成员写操作 编译时会报错,提高安全系;

.5常量数组

类型 const 数组名[大小]

int const arr[10] = {1,2,3,4,5,6,7,8,9,10};

.6常量指针

const 类型* 指针名

int const arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int const *p_int = arr;//指向数组arr
//*p_int =10;    //不能修改指针指向的值

.7指针常量

类型* const 指针名

    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    int *const p_int = arr;
    *p_int = 10;//正确
    p_int = arr;//错误 指向原来的也不对  不可修改

指针常量是指针本身是一个常量,指向地址不能修改(指向的单语言不一定是常量)

常量指针是不能修改指向内存地址的值

const int* p = &value;
int * const q = &value;

这两个语句的含义是不同的,前者是"所指内容不可变",后者则是"指向的地址不可变"

3.函数的默认参数

int def_var_1 = 20;

void default_parameter_func(int num1 = def_var_1, int num2 = 3, char ch = ‘*‘);

4.内联函数

inline

inline int max(int a, int b)
{
    return a > b ? a : b;
}

5.函数重载

void display();
void display(const char*);
void display(int one ,int two);
void display(float number);

6.强制类型转换

C语言

int b;
float a = (float)b;

C++

int b;
float a = float(b);//这种方式类似函数

+4

static_cast

static_cast<new_type>(expr)

主要有以下用法:(1)用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。(2)用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。(3)把空指针转换成目标类型的空指针。(4)把任何类型的表达式转换成void类型。 注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性。
#include<iostream>
#include <string>

using namespace std;

class Base {};
class Derived:public Base{};

int main()
{
    float f = 12.3;
    float* pf = &f;

    int n = static_cast<int>(f); //ok n=12

    //int* pn = static_cast<int*>(pf);//无法从float*转换为int*

    void* pv = static_cast<void*>(pf);//ok
    int* pn2 = static_cast<int*>(pv);//ok 但pn2无意义

    Base * p_a = new Base;
    Derived * p_b = static_cast<Derived*>(p_a);

    Base o_a;
    Derived o_b;

    o_a = *p_b;//正确 隐式转换 子对象转换为父对象
    o_a = static_cast<Derived>(*p_b);//正确 显示转换

    o_b = *p_a;//错误 不存在父对象转换为子对象
    o_b= static_cast<Derived>(*p_a);//错误

    return 0;
}

dynamic_cast

dynamic_cast <new_type> (expr)

把expr转换为newtype对象

将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理
即会作一定的判断。
对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针;
对引用进行dynamic_cast,失败抛出一个异常,成功返回正常cast后的对象引用。

注意:dynamic_cast在将父类cast到子类时,父类必须要有虚函数。例如在下面的代码中将CBasic类中的test函数不定义成
virtual时,编译器会报错:error C2683: dynamic_cast : “CBasic”不是多态类型

#include <iostream>
using namespace std; 

class CBasic
{
public:
     virtual int test(){return 0;} // 一定要是 virtual
}; 

class CDerived : public CBasic
{
public:
     virtual int test(){    return 1;}
}; 

int main()
{
     CBasic        cBasic;
     CDerived    cDerived; 

     CBasic * pB1 = new CBasic;
     CBasic * pB2 = new CDerived; 

     //dynamic cast failed, so pD1 is null.
     CDerived * pD1 = dynamic_cast<CDerived * > (pB1);    

     //dynamic cast succeeded, so pD2 points to  CDerived object
     CDerived * pD2 = dynamic_cast<CDerived * > (pB2);    

     //dynamci cast failed, so throw an exception.
//    CDerived & rD1 = dynamic_cast<CDerived &> (*pB1);    

//dynamic cast succeeded, so rD2 references to CDerived object.
     CDerived & rD2 = dynamic_cast<CDerived &> (*pB2);    

     return 0;
}

const_cast

const_cast <new_type> (expression)

const_cast转换符是用来移除变量的const或volatile限定符

const int constant = 21;
const int* const_p = &constant;
int* modifier = const_cast<int*>(const_p);
*modifier = 7;

reinterpret_cast

reinterpret_cast <new_type> (expression)

处理无关类型之间的转换.可以把一个指针转换为一个整数,也可以把一个整数转换为一个指针,还可以不同指针之间的转换

  • 从指针类型到一个足够大的整数类型
  • 从整数类型或者枚举类型到指针类型
  • 从一个指向函数的指针到另一个不同类型的指向函数的指针
  • 从一个指向对象的指针到另一个不同类型的指向对象的指针
  • 从一个指向类函数成员的指针到另一个指向不同类型的函数成员的指针
  • 从一个指向类数据成员的指针到另一个指向不同类型的数据成员的指针

这也是一个很不安全的转换,只有转换为原始类型,彩色正确使用reinterpret_cast的方式

#include <iostream>
// Returns a hash code based on an address
unsigned short Hash( void *p ) {
    unsigned int val = reinterpret_cast<unsigned int>( p );
    return ( unsigned short )( val ^ (val >> 16));
}

using namespace std;
int main() {
    int a[20];
    for ( int i = 0; i < 20; i++ )
        cout << Hash( a + i ) << endl;
}

//如果跟我一样是64位的系统,可能需要将unsigned int改成 unsigned long才能运行。

7.输入输出流

ostream

istream

cout.put(71).put(79).put(79).put(68).put(‘\n‘); //GOOD

cout.put(65+32)//字符a

时间: 2024-10-15 09:31:20

CPP.1新加特性的相关文章

总结常见的ES6新语法特性。

前言 ES6是即将到来的新版本JavaScript语言的标准,他给我们带来了更"甜"的语法糖(一种语法,使得语言更容易理解和更具有可读性,也让我们编写代码更加简单快捷),如箭头函数(=>).class等等.用一句话来说就是: ES6给我们提供了许多的新语法和代码特性来提高javascript的体验 不过遗憾的是,现在还没有浏览器能够很好的支持es6语法,点这里查看浏览器支持情况,所以我们在开发中还需要用babel进行转换为CommonJS这种模块化标准的语法. 因为下面我会讲到一

总结常见的ES6新语法特性

总结常见的ES6新语法特性 ES6给我们带来了更"甜"的语法糖(一种语法,使得语言更容易理解和更具有可读性,也让我们编写代码更加简单快捷),如箭头函数(=>).class等等.用一句话来说就是: ES6给我们提供了许多的新语法和代码特性来提高javascript的体验 不过遗憾的是,现在还没有浏览器能够很好的支持es6语法,点这里查看浏览器支持情况,所以我们在开发中还需要用babel进行转换为CommonJS这种模块化标准的语法. 因为下面我会讲到一些es6新特性的例子,如果想要

framwork新加模块

主要是基于Android系统现在的Framework模块上再添加一个独立的模块,目前只是很简单的framework层调用native层(后期根据学习的进度,会将hal层补上,还有aidl, stub, 异步).基本思路为: 为应用添加framework接口,即SDK APIframework调用native代码,即jni部分jni部分实现最终功能 最终功能其实就是很简单的log打印,目的只要是重新温习一下framework开发的流程.之前都是在Android现有的机制上添加API,这次尝试添加一

UWP中新加的数据绑定方式x:Bind分析总结

UWP中新加的数据绑定方式x:Bind分析总结 0x00 UWP中的x:Bind 由之前有过WPF开发经验,所以在学习UWP的时候直接省略了XAML.数据绑定等几个看着十分眼熟的主题.学习过程中倒是也没遇到麻烦.直到在园子里看到了这篇文章: http://www.cnblogs.com/gaoshang212/p/4534138.html 原来UWP的绑定中新加了个x:Bind,从文章中可以看到x:Bind的效率是很高的.找到MSDN(数据绑定)看了一下(完整的学习目录可参见: http://w

Atitit.&#160;Object-c语言&#160;的新的特性&#160;&#160;attilax总结

Atitit. Object-c语言 的新的特性  attilax总结 1.1. Object-C语言由 Brad J.Cox于20世纪80年代早期设计,1 1.2. Object-C新增的数据结构:1 1.3. 类扩展1 1.4. 动态特性 Object-C中一个强大的特性就是它的动态因素.2 1.5. 多重继承的偏方  一个类可以实现若干的协议,从这个角度实现了类的多重继承.2 1.6. 实体方法   静态函数  减号“-”  加号“+” 声明2 1.7. 调用方法:Objective-C里

Android 6.0 系统棉花糖新的特性和功能

Get you apps ready for Android 6.0 Marshmallow! 新的功能:运行时的权限提醒,Doze(打盹模式)和备用电源,协助新技术,等等. Android 6.0Changes 伴随着新的特性和功能,Android 6.0(API level 23)在系统上和API的使用上做了一些改变. 如果我们已经发布了一款app,那么就要关注一下这些改变会不会影响应用的运行. RuntimePermissions 这是一种新的权限使用模型,用户可以在程序运行中直接管理应用

C# 3.0新语言特性和改进(一)

引言 关于C#3.0的特性,园子里已经有了一大把,可能大家都很熟悉了,虽然本人开发中使用过,但自己还是需要记录一下,总结一下.同时也是后面写Linq知识的基础.希望有兴趣的朋友,可以看看. C# 3.0新语言特性和改进包括: 自动属性 隐含类型局部变量 匿名类型 对象与集合初始化器 扩展方法 Lambda表达式和Lambda表达式树 1. 自动属性 自动属性可以避免我们编写实体类时声明私有变量和get/set的逻辑,取而代之的是,编译器会自动为你生成一个私有变量和默认的get/set 操作. 在

Atitit.&#160;atiJavaExConverter4js&#160;&#160;新的特性

Atitit. atiJavaExConverter4js  新的特性 1.1. V1新特性1 1.2. V2 新特性1 2. Keyword1 3. Catch1 4. Convert n Throw ex2 5. --atiex2 1.1. V1新特性 Java ex convert 1.2. V2 新特性 Catch 不同的ex 2. Keyword Try catch的库方式实现 Ajax的error catch Ex.js 作者:: 绰号:老哇的爪子 ( 全名::Attilax Akb

新加了一块硬盘,在bios中可以看的到,在系统的磁盘管理器中看不到新加硬盘

今天新加了一块硬盘,进入bios中可以看到新加的硬盘,但是进入系统后在磁盘管理及磁盘驱动器中都看不到.并且在设备管理器下其他设备出现了ATA channel1,前面显示感叹号,如下图所示: 而且电脑变得特别的卡.最后在一位同事的帮助下,终于解决了. 解决方法如下: 1.在ATA channel1上右击,点击更新驱动程序软件=>浏览计算机以查找驱动程序软件=>在浏览中选择C:\windows\winsxs=>下一步 2.然后你将会在IDE ATA/ATAPI控制器中看到ATA channe