十 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. [Cypress] Interact with Hidden Elements in a Cypress Test

    We often only show UI elements as a result of some user interaction. Cypress detects visibility and ...

  2. [Java][Spring][scurity]同步session控制,防止一个用户多次登录

    [Spring][scurity]同步session控制.防止一个用户多次登录 假设你希望限制单个用户仅仅能登录到你的程序一次,Spring Security通过加入以下简单的部分支持这个功能. 1. ...

  3. loosejar原理简要分析

    loosejar这个小工具能够动态分析出应用中有每一个jar包的实际使用情况,详情请參阅<通过loosejar清理应用中冗余的jar包>基本原理是利用instrumentation的特性用 ...

  4. Android中的GraphicBuffer同步机制-Fence

    Fence是一种同步机制,在Android里主要用于图形系统中GraphicBuffer的同步.那它和已有同步机制相比有什么特点呢?它主要被用来处理跨硬件的情况.尤其是CPU.GPU和HWC之间的同步 ...

  5. 严格符合CommonJS规范的包特性

    严格符合CommonJS规范的包应该具备下面特性: 1.package.json必须在包的顶层文件夹下. 2.二进制文件应该在bin文件夹下. 3.JavaScript代码应该在lib文件夹下. 4. ...

  6. SerializeUtil 序列化,反序列化工具类

    package cloud.app.prod.home.utils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutp ...

  7. C++ 中的友元(friend)

    首先友元不是一个好的设计,它破坏了封装.并且自身有很多局限:比如友元关系不能被继承:友元关系是单向的,不具有交换性:友元关系不具有传递性. 类内声明的 friend 变量(或者函数)在访问该类的成员时 ...

  8. MySQL:常用语句

    ylbtech-MySQL:常用语句 1.返回顶部 1. -- ---------------------------- -- Table structure for st_student -- -- ...

  9. linux的shell函数参数

    在Shell中,调用函数时可以向其传递参数.在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数... 带参数的函数示例: #!/bin/bash funWit ...

  10. Python 34(进程重点)

    一:开启进程的两种方式(*****) #开启进程的方式一: from multiprocessing import Process import time def task(name): print( ...