<<从0到1学C++>> 第2篇 认识C++面向过程编程的特点

栏目: C++ · 发布时间: 7年前

内容简介:C++允许为同一个函数定义几个版本, 从而使一个函数名具有多种功能, 这称之为函数重载.像这样: 虽然函数名一样, 但是参数列表不一样, 一个求两个整型参数的最大值, 一个求三个整型参数的最大值.

一. 本篇要学习的内容和知识结构概览

<<从0到1学C++>> 第2篇 认识C++面向过程编程的特点

二. 知识点逐条分析

1. 使用函数重载

C++允许为同一个函数定义几个版本, 从而使一个函数名具有多种功能, 这称之为函数重载.

像这样: 虽然函数名一样, 但是参数列表不一样, 一个求两个整型参数的最大值, 一个求三个整型参数的最大值.

int getMax(int a, int b) {
    if (a > b) {
        return a;
    } else {
        return b;
    }
}

int getMax(int a, int b, int c) {
    if (a > b) {
        if (a > c) {
            return a;
        } else {
            return c;
        }
    } else {
        if (b > c) {
            return b;
        } else {
            return c;
        }
    }
}
复制代码

2. 新的基本数据类型及其注意事项

a. void是无类型标识符, 只能声明函数的返回值类型, 不能声明变量

b. C++当中有bool类型, 而C中没有

c. C++的常量分为符号常量, 浮点常量, 整数常量

像这样:

<<从0到1学C++>> 第2篇 认识C++面向过程编程的特点

我们可以通过屏幕输出来查看011, 11, 0x11各代表十进制的多少

int a = 011; // 八进制数
cout << a << endl; // 以十进制格式输出

int b = 11; // 十进制数
cout << b << endl; // 以十进制格式输出

int c = 0x11; // 十六进制
cout << c << endl; // 以十进制格式输出
复制代码

3. 动态分配内存

申请内存空间: new 类型名[size], 申请可以存size个该数据类型对象的存储空间

释放内存空间: delete 指针名;

像这样:

int * p; // 声明int类型指针
p = new int[5]; // 申请5个int类型数据的存储空间
cout << p << endl; // 该内存空间的首地址
delete p; // 释放内存空间
复制代码

4. 引用

为现有对象起个别名, 别名代表的内存空间与引用对象的内存空间是一样的

引用的声明方式: 数据类型(类型名) & 别名 = 对象名;

&的位置无关紧要

像这样:

int c = 10;
int & d = c;
int& e = c;
int &f = c;
cout << c << endl;
cout << d << endl;
cout << e << endl;
cout << f << endl;复制代码

我们再进一步的使用它

int a = 5; // 定义int类型变量, 并赋值
cout << a << endl; // 输出变量a的值: 5
cout << &a << endl; // 输出变量a的地址: 0x7ffeefbff52c

int & b = a;
cout << b << endl; // 引用b的值: 5
cout << &b << endl; // 引用b的地址: 0x7ffeefbff52c复制代码

可以看到, 上下两组输出结果是一样的, 也就是说引用b, 和变量a都是代表的同一块内存地址

所以更改b的值, a的值也会变

b = 8;

cout << a << endl;
复制代码

注意: 引用, 就是给一块已经存在的内存添加一个新的标识符, 所以使用引用没有分配新的内存空间, 所以可以通过引用来修改原来的对象, 但是不能有空引用, 它必须和一声正确的存储区域关联

像这样: 是错误的

int & b; // 编译器提示信息: Declaration of reference variable 'b' requires an initializer, 变量b需要一个初始化器

引用的作用

a. 引用用于函数的参数表, 不产生临时对象, 提高安全性和执行效率

void swap(int & a, int & b) {
int temp = a;
a = b;
b = temp;
}

int a = 5;
int b = 10;
cout << "交换前 " << "a的值:" << a << " b的值:" << b << endl;
swap(a, b);
cout << "交换后 " << "a的值:" << a << " b的值:" << b << endl;
复制代码

b. 引用用于函数返回值 用到的时候很少, 因为不安全, 你可能问访问到一个已经被释放的对象

引用可以这么使用

int a = 5;
int & b = a; // 声明引用
int * p = &a; // 声明指向变量的指针
int * q = &b; // 声明指向引用的指针
int * & r = p; // 声明指针对指针的引用 (p, r是指针, 等号左边 * 代表声明的r是指针, &代表声明的r是引用)复制代码

但是不能这么使用

int & & s = a; // 不能声明引用的引用
复制代码

指针和引用的区别和联系

联系: 它们都会对内存地址上存在的变量进行修改, 但引用不占用新的地址, 节省开销

区别: 指针是低级的直接操作内存地址的机制, 可由整型数强制类型转换得到, 功能强大, 但是容易出错, 引用是较高级的封装了指针的特性, 不直接操作内存地址, 不可强制类型转换得到, 安全性高

5. 对指针使用const限定符

a. 指向常量的指针

int a = 5;
int b = 8;
const int * p = &a; // 指向常量的指针, 也就是"*p="不成立, 也就是不能通过指针p修改指向的内存地址中的值, 但是p的值可以更改
*p = 10; // 错误
p = &b; // 正确
复制代码

b. 常量指针

int a = 5;
int b = 8;
int * const p = &a; // 常量指针, 也就是"p="不成立, 也就是p的值不能更改, 但是是它所指向的内存地址中的值可以修改
*p = 10; // 正确
p = &b; // 错误

复制代码

c. 指向常量的常量指针

int a = 5;
int b = 8;
const int * const p = &a; // 指向常量的的常量指针, 既不可以通过p修改它所指向的内存地址中的值, 也不可更改p的值
*p = 10; // 错误
p = &b; // 错误复制代码

6. 泛型算法应用于普通数组

// 定义数组
int a[] = {3, 2, 1, 5, 4};
int b[5] = {};

// 数组反转
//    reverse(a, a + 5);

// 升幂排序
//    sort(a, a + 5);

// 降幂排序
//    sort (a, a+5, greater<int>());

// 复制数组内容
//    copy(a, a + 5, b);

// 逆向复制数组a中的内容到数组b
//    reverse_copy(a, a + 5, b);

// 检索
//    int * p = find(a, a + 5, 5);
//    cout << p << endl;
//    cout << a + 5 << endl;
//    if (p == a + 5) {
//        cout << "没有值为5的数组元素" << endl;
//    } else {
//        cout << "有值为5的数组元素" << endl;
//    }

// 正向输出
copy(a, a + 5, ostream_iterator<int>(cout, "数字 "));

cout << endl;

// 逆向输出
reverse_copy(a, a + 5, ostream_iterator<int>(cout, "数字 "));

for (int i = 0; i < 5; i++) {
    cout << a[i] << " ";
}

cout << endl;

for (int i = 0; i < 5; i++) {
    cout << b[i] << " ";
}

cout << endl;复制代码

7. 程序的编辑, 编译, 连接, 运行的基本概念

使用编辑器编辑一个C++源程序, 也就是源文件, 扩展名为.cpp, 像这样: Hello.cpp;

使用C++编译器对这个源程序进行编译, 产生目标文件, 扩展名为.obj, 像这样: Hello.obj;

使用连接程序, 将目标文件与系统库连接, 产生可执行文件, 扩展名为.exe, 你这样: Hello.exe

任何时候我们都不要忘记语言只是我们解决问题的工具, 思想才是我们解决问题的本质, 技术不深, 我们可以去查, 去练习, 而思想只有慢慢的去陪养, 去思考, 去总结!

本系列文章会持续更新! 大家踊跃的留下自己的脚印吧!

:footprints: :footprints::footprints::footprints::footprints::footprints::footprints::footprints:


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Neural Networks for Applied Sciences and Engineering

Neural Networks for Applied Sciences and Engineering

Samarasinghe, Sandhya / CRC Pr I Llc / 2006-9 / $ 118.59

In response to the exponentially increasing need to analyze vast amounts of data, Neural Networks for Applied Sciences and Engineering: From Fundamentals to Complex Pattern Recognition provides scient......一起来看看 《Neural Networks for Applied Sciences and Engineering》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具