《C++程序设计教程》——C++对C语言的扩充

1.3 C++对C语言的扩充

1.3.1 bool 类型

1.3.2 C++中类型转换

C++类型转换符一共有四种:
static_cast<new_type>(expression);
const_cast<new_type>(expression);
dynamic_cast<new_type>(expression);
reinterpret_cast<new_type>(expression);

(1)static_cast<>:
  最常用的类型转换操作符,它主要执行非多态的转换,用于代替C语言中通常的转换操作。
(2)const_cast<>:
  在进行类型转换时用来修改类型的const或volatile属性,除了const或volatile修饰之外,原来的数据值和数据类型都是不变的。
(3)dynamic_cast<>:
  该操作符用于运行时检查类型转换是否安全,但只在多态类型时合法,即该类型至少具有一个虚拟方法。
(4)einterpret_cast<>:
 通常为操作数的位模式提供较低层的重新解释。

1.3.3 C++中的字符串——string

(1)用string来定义字符串

string s1; s1="hello C++";
string s2="hello C++";
string s3("hello C++");
string s4(6,'a');

(2)用[]来访问字符串中的字符
  可以用是s[i]的形式来访问操作字符串中的字符。
(3)直接用“+”运算符将两个string字符串连接

cout<<s1+s2<<endl;

(4)可以直接比较两个string字符串是否相等

if(s1<s2) ....

(5)length()和size()函数
  这两个函数都用来获取字符串的长度,功能相同,类似于C语言中的strlen()函数

s.length();
s.size();

(6)swap()函数
  用来交换两个字符串的值,其函数声明如下:

void swap(string &s);

1.3.4 引用

(1)引用的初始化

// 数据类型 &引用名 = 变量名;
int a=10;
int &b=a;

注意:

● 引用在定义时必须初始化,如int &b;语句是错误的。
● 引用在初始化时只能绑定左值,不能绑定常量值,如int &b=10;语句是错误的。
● 引用一旦初始化,其值就不能再更改,即不能再做别的变量的引用。
● 数组不能定义引用,因为数组是一组数据,无法定义其别名。

(2)引用作为函数参数

void swap(int& x, int& y)
{
......
}
int mian()
{
...
int a,b;
swap(a,b);
...
}

引用作为函数参数特点:
● 传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。
● 使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。
● 使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用”*指针变量名”的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。

(3)引用于const限定符

const int &a = 10; //常量值初始化const引用
const int a = 10;
const ing &b = a; //const对象初始化const引用

用非const对象初始化const引用,只是不允许通过该引用修改变量值。除此之外,const引用甚至可以用不同类型的变量来初始化const引用,例如:

double d = 1.2;
const int &b = d;

1.3.5 动态分配内存(new和delete)

(1)new运算符

//new 数据类型(初始化列表)
//创建基本数据类型对象
char *pc = new char; //申请一段空间来存储char类型,内存没有初始值
int *pi = new int(10);//申请一段空间存储int类型数据,初始值为10
double *pd = new double();//申请一段空间存储double类型数据,默认初始值为0
//创建数组对象
//new 数组类型[数组长度]
int *pi = new int[10]();
char *pc = new char[10];
double *pd = new double[0]; 

(2)delete 操作符

//delete 指针名;
//释放数组:delete []指针名;
delete pi;
delete []pc;

1.3.6 默认参数

在定义或声明函数时给形参一个初始值,在调用函数时,如果不传递实参就使用默认参数值。
注意:

● 默认参数只可以在函数声明中出现一次,如果没有函数声明,只有函数定义,才可以在函数定义中设定。
● 默认参数定义是自右向左,即如果一个参数设定了默认参数,则其右边不能再有普通参数。
● 默认参数调用时,遵循参数调用顺序,即有参数传入它会先从左向右依次匹配。
● 默认参数值可以是全局变量,全局常量,甚至可以是一个函数,但不可以是局部变量,因为默认参数的值是在编译时确定的,而局部变量位置与默认值在编译时无法确定。

1.3.7 内联函数

inline只是建议编译器将函数嵌入到调用处,编译器会根据函数的长度,复杂度等自行决定是否把函数作为内联函数来调用。

1.3.8 重载函数

所谓的重载(overload)函数就是在同一个作用域内几个函数名字相同但形参列表不同。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值