十 C++的引用(Reference)

 引用型函数参数
)将引用用于函数的参数,可以修改实参变量的值,同时也能减小函数调用的开销。
)引用参数有可能意外修饰实参的值,如果不希望修改实参变量本身,可以将其定义为常引用,提高传参效率的同时还可以接收常量型的实参。 引用型函数返回值
)可以将函数返回类型声明为引用,避免函数返回值所带来的开销。
)一个函数返回类型被声明为引用,那么该函数返回值可以是一个左值。
)为了避免在函数外部修改引用的目标,可以为该引用附加常属性。
eg:
int& foo(void){
static int a = ;
return a;
}
int main(void)
{
foo() = ;//ok
}
注:不要返回局部变量的引用,因为所引用的目标内存会在函数返回以后被释放,危险!
但是可以返回成员变量、静态变量、全局变量的引用 //笔试题:引用和指针的区别...
引用和指针
)从C语言角度,引用的本质就是指针,但是在C++中推荐使用引用而不是指针。
eg:
double d = 3.14;
double& rd = d;
double* const pd = &d;
rd <=等价=>*pd
)指针定义可以不做初始化,其目标可以修改(指针常量除外),而引用必须做初始化,而且一旦初始化所引用的目标能再改变。
eg:
int a=,b=;
int* p;//ok,可以不初始化
//int& r;//error
p = &a;
p = &b;
int& r = a;
r = b;//不是修改引用的目标,而是对r(a)进行赋值 //后面了解
)可以定义指针的指针(二级指针),但是不能定义引用的指针
eg:
int a = ;
int* p = &a;
int** pp = &p; int& r = a;
int& * pr = &r;//error
int* pr = &r;//ok,是一个普通的指针
)可以定义指针的引用,但是不能定义引用的引用
eg:
int a = ;
int* p = &a;
int* & rp = p;//ok,指针的引用
-----------
int& r = a;
int&& rr = r;//error,在C++11中称为右值引用
int& r2 = r;//ok,不能称为引用的引用,只是一个普通的引用,相当于给a再起一个别名。 )可以指针数组,但是不能引用数组
eg:
int a=,b=,c=;
int* parr[] = {&a,&b,&c};//指针数组
int& rarr[] = {a,b,c};//error
)可以定义数组引用
eg:
int arr[] = {,,};
//rarr称为数组引用,给数组起一个别名
int (&rarr)[] = arr;//ok
arr[] <-等价-> rarr[]
)和函数指针一样,可以定义函数引用,语法和函数指针一致。
eg:
void func(int a,int b){...}
int main(void){
//定义和使用函数指针
void (*pfunc)(int,int) = func;
pfunc(,);
//定义和使用函数引用
void (&rfunc)(int,int) = func;
rfunc(,);
}
======================================
十一 类型转换
隐式类型转换
eg:
char c = 'A';
int n = c;//隐式类型转换
-----------
void foo(int n){..}
foo(c);//隐式类型转换
-----------
int foo(void){
char c = 'A';
return c;//隐式类型转换
}
强制类型转换
eg:
char c = 'A';
int n = (int)c;//C风格的强制转换
int n = int(c);//C++风格的强制转换 C++增加了四种操作符形式的显式类型转换
)静态类型转换
语法:
目标类型变量 =
static_cast<目标类型>(源类型变量);
适用场景:
用于将void*转换为其它类型指针。
eg:
int a = ;
void* pv = &a;//ok
int* pi = pv; //error
int* pi = static_cast<int*>(pv);//ok )动态类型转换(后面讲)
语法:
目标类型变量 =
dynamic_cast<目标类型>(源类型变量);
)常类型转换
语法:
目标类型变量 =
const_cast<目标类型>(源类型变量);
适用场景:用于去除一个指针或引用的常属性
eg:
int a = ;
const int* pa = &a;
*pa = ;//error
int* pa2 = const_cast<int*>(pa);
*pa2 = ;//ok
-------------------
const int& r = a;
r = ;//error
int& r2 = const_cast<int&>(r);
r2 = ;//ok )重解释类型转换
语法:
目标类型变量 =
reinterpret_cast<目标类型>(源类型变量);
适用场景:
-->任意类型的指针或引用之间的转换
-->在指针和整型数之间的转换
eg:
int addr = 0x12345678;
int* p =
reinterpret_cast<int*>(0x12345678);
*p = ;
======================
小结:
慎用宏,用const、enum、inline替换
#define PAI 3.14 --》const double PAI = 3.14 #define STATE_SLEEP 0
#define STATE_RUN 1
#define STATE_STOP 2
--》enum STATE{SLEEP,RUN,STOP}; #define max(a,b) ((a)>(b)?(a):(b))
--> inline int max(int a,int b){
return a > b ? a : b;
}
变量随用随声明同时初始化 尽量使用new/delete分配,取代malloc/free 少用void*、指针计算、联合体、强制转换 尽量使用string表示字符串,少用C中的char*表示的字符串 ====================================
十二 类和对象//了解
什么是对象?
万物皆对象,任何一种事物都可以看做是对象。 如何描述对象?
通过对象的属性(名词、数量词、形容词)和行为(动词)描述和表达对象。 面向对象的程序设计
对自然世界中对象观察引入到编程实践的一种理念和方法。这种方法称为"数据抽象",即在描述对象时把细节的东西剥离出去,只考虑一般性的,有规律性的和统一性的东西。 什么是类?
类是将多个对象的共性提取出来定义的一种新的数据类型,是对 对象的属性和行为的抽象描述。

C++引用、类型转换、类和对象(day03)的更多相关文章

  1. [C++]变量存储类别,指针和引用,类与对象,继承与派生的一些摘要

    C++中共有四种存储类别标识符:auto/static/register/extern 1.auto 函数或分程序内定义的变量(包括形参)可以定义为auto(自动变量).如果不指定存储类别,则隐式定义 ...

  2. xaml 中 引用嵌套类的对象

    public class MotorType1 { public class MotorType2 { public class MotorType3 { /// <summary> // ...

  3. [Java初探08]__简单学习Java类和对象

    前言 在前面的学习中,我们对面向对象的编程思想有了一个基本的了解,并且简单的了解了类和对象的定义.那么类和对象在Java语言中是如何表现的,这次,就从实际出发,学习一下一下类和对象在Java语言中的使 ...

  4. c++,基类声明的指针变量和引用类型变量可以指向派 生类的对象

    基类声明的指针变量和引用类型变量可以指向派生类的对象,而反过来派生类的指针却不能指向基类变量. 这与基类和派生类之间,被允许的赋值方向是相反的. 但是从逻辑上很容易推敲其合理性.

  5. 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感

    关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...

  6. Java自学-类和对象 引用

    什么是Java中的引用? 引用的概念,如果一个变量的类型是 类类型,而非基本类型,那么该变量又叫做引用. 步骤 1 : 引用和指向 new Hero(); 代表创建了一个Hero对象 但是也仅仅是创建 ...

  7. Java知识系统回顾整理01基础07类和对象01引用

    一.引用的定义 引用的概念,如果一个变量的类型是 类类型,而非基本类型,那么该变量又叫做引用. 二.引用和指向 new Hero(); 代表创建了一个Hero对象 但是也仅仅是创建了一个对象,没有办法 ...

  8. 【JAVA】笔记(2)---面向过程与面向对象;类,对象;实例变量,引用;构造方法;

    面向过程与面向对象: 1.面向过程思想的典型栗子是C语言,C语言实现一个程序的流程是:在主函数中一步一步地罗列代码(定义子函数来罗列也是一样的道理),以此来实现我们想要的效果: 2.面向对象思想的典型 ...

  9. Object类和对象类型转换

    学习内容:Object类和对象类型转换 一.Object类 1.Object类是所有类的父类,是Java类层中最高层的类. 2.getClass()方法:返回对象执行时的Class实例,然后用此实例调 ...

随机推荐

  1. pthread_rwlock pthread读写锁

    原文: http://www.cnblogs.com/diegodu/p/3890450.html 使用读写锁 配置读写锁的属性之后,即可初始化读写锁.以下函数用于初始化或销毁读写锁.锁定或解除锁定读 ...

  2. [RxJS 6] The Catch and Rethrow RxJs Error Handling Strategy and the finalize Operator

    Sometime we want to set a default or fallback value when network request failed. http$ .pipe( map(re ...

  3. Git 主要的工作流程

    Git使用个进制字符的SHA- Hash来唯一标识对象 如:e98757d0598ab6eeaf1df0d87dd00826048bd80b git 有种对象 1.blob 表示文本文件,二进制文件或 ...

  4. Xposed获取微信usernamepassword

    请关注我的微信公众号 參考文章:Xposed恶意插件 Android 安全专项-Xposed 劫持usernamepassword实践 0x00 我在之前的文章中演示了一下怎样通过Xposed获取us ...

  5. Android之怎样使用ListView列表视图

    ListView 列表视图创建方法: (1)直接使用ListView 组件创建 (2)让Activity继承ListActivity实现 第一种:在XML中直接使用ListView 组件创建 在val ...

  6. leetcode第一刷_Convert Sorted Array to Binary Search Tree

    晕.竟然另一样的一道题.换成sorted array的话.找到中间位置更加方便了. TreeNode *sortTree(vector<int> &num, int start, ...

  7. iOS APP开发概述----学习笔记001

    之前开发过一些Android APP,如今開始学习iOS开发,未来实际工作应该会用到.未雨绸缪. 一.了解其系统层次架构 其系统分层四层,其具体例如以下: 第一层:Core OS watermark/ ...

  8. 【POJ 2449】 Remmarguts' Date

    [题目链接] http://poj.org/problem?id=2449 [算法] A*(启发式搜索) 首先,求第k短路可以用优先队列BFS实现,当T第k次入队时,就求得了第k短路,但是,这种做法的 ...

  9. 第1课 Git、谁与争锋

    1-1  安装和使用Git http://git-scm.com/downloads Git的指令模式,才能够清楚地了解Git的工作细节.最后还会介绍Git Server的架设和管理,让读者能够熟练使 ...

  10. 0507-php独立环境的安装与配置

    1.在一个纯英文目录下新建三个文件夹 2.安装apache(选择好版本) 过程中该填的按格式填好,其余的只更改安装目录即可 如果报错1901是安装版本的问题. 检查:安装完成后localhost打开为 ...