C++引用、类型转换、类和对象(day03)
十 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)的更多相关文章
- [C++]变量存储类别,指针和引用,类与对象,继承与派生的一些摘要
C++中共有四种存储类别标识符:auto/static/register/extern 1.auto 函数或分程序内定义的变量(包括形参)可以定义为auto(自动变量).如果不指定存储类别,则隐式定义 ...
- xaml 中 引用嵌套类的对象
public class MotorType1 { public class MotorType2 { public class MotorType3 { /// <summary> // ...
- [Java初探08]__简单学习Java类和对象
前言 在前面的学习中,我们对面向对象的编程思想有了一个基本的了解,并且简单的了解了类和对象的定义.那么类和对象在Java语言中是如何表现的,这次,就从实际出发,学习一下一下类和对象在Java语言中的使 ...
- c++,基类声明的指针变量和引用类型变量可以指向派 生类的对象
基类声明的指针变量和引用类型变量可以指向派生类的对象,而反过来派生类的指针却不能指向基类变量. 这与基类和派生类之间,被允许的赋值方向是相反的. 但是从逻辑上很容易推敲其合理性.
- 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感
关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...
- Java自学-类和对象 引用
什么是Java中的引用? 引用的概念,如果一个变量的类型是 类类型,而非基本类型,那么该变量又叫做引用. 步骤 1 : 引用和指向 new Hero(); 代表创建了一个Hero对象 但是也仅仅是创建 ...
- Java知识系统回顾整理01基础07类和对象01引用
一.引用的定义 引用的概念,如果一个变量的类型是 类类型,而非基本类型,那么该变量又叫做引用. 二.引用和指向 new Hero(); 代表创建了一个Hero对象 但是也仅仅是创建了一个对象,没有办法 ...
- 【JAVA】笔记(2)---面向过程与面向对象;类,对象;实例变量,引用;构造方法;
面向过程与面向对象: 1.面向过程思想的典型栗子是C语言,C语言实现一个程序的流程是:在主函数中一步一步地罗列代码(定义子函数来罗列也是一样的道理),以此来实现我们想要的效果: 2.面向对象思想的典型 ...
- Object类和对象类型转换
学习内容:Object类和对象类型转换 一.Object类 1.Object类是所有类的父类,是Java类层中最高层的类. 2.getClass()方法:返回对象执行时的Class实例,然后用此实例调 ...
随机推荐
- CF #324 DIV2 E题
这题很简单,把目标位置排序,把目标位置在当前位置前面的往前交换,每次都是贪心选择第一个满足这样要求的数字. #include <iostream> #include <cstdio& ...
- keras 与tensorflow 混合使用
keras 与tensorflow 混合使用 tr:nth-child(odd) > td, .table-striped tbody > tr:nth-child(odd) > t ...
- VB.NET机房收费 & 抽象工厂模式
学习设计模式的时候,提到了一个专门訪问数据库的模式-抽象工厂模式,记得当时举样例理解的时候并未设计到数据库,仅仅是大概了了解了一下,如今对于机房收费系统涉及到了数据库的管理,借此机会好好学习一下.用常 ...
- HDU 2206 IP的计算(字符串处理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2206 Problem Description 在网络课程上,我学到了非常多有关IP的知识. IP全称叫 ...
- Swift代理和传值
第一个视图控制器: import UIKit // 遵循协议 class ViewController: UIViewController,SecondVCDelegate { override fu ...
- hdoj-1896 stones
Stones Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Sub ...
- Principal Component Analysis ---- PRML读书笔记
To summarize, principal component analysis involves evaluating the mean x and the covariance matrix ...
- HTTP权威协议笔记-9.Web机器人
经过整个春节的放肆,终于回归了,说实话,春节真心比上班累. 9.1 爬虫及爬行方式 (1) 爬虫:Web爬虫是一种机器人,他们会递归性的对各种信息Web站点进行遍历. (2) 爬行方式:Web机器人会 ...
- BZOJ 2969 期望
思路: 我们可以分开算每个格子自己的期望啊... 期望可以累加的 那就把这个大格子 分成 9个部分 分别算好了... //By SiriusRen #include <cmath> #in ...
- POJ 1985 求树的直径 两边搜OR DP
Cow Marathon Description After hearing about the epidemic of obesity in the USA, Farmer John wants h ...