从C到C++

目录

从C到C++

[1、 引用(掌握)](#1、 引用(掌握))

[1.1 概念](#1.1 概念)

[1.2 引用的性质](#1.2 引用的性质)

[1.3 引用参数](#1.3 引用参数)

[2、 赋值(熟悉)](#2、 赋值(熟悉))

[3、 键盘输入(熟悉)](#3、 键盘输入(熟悉))

[4、 string字符串类(掌握)](#4、 string字符串类(掌握))

5、函数

[5.1 内联函数(掌握)](#5.1 内联函数(掌握))

[5.2 函数重载 overload(重点)](#5.2 函数重载 overload(重点))

[5.3 哑元函数(熟悉)](#5.3 哑元函数(熟悉))


从C到C++

1、 引用(掌握)

1.1 概念

引用从一定程度上讲是指针的平替,几乎被所有的面型对象编程语言所使用。引用相当于对某一目标变量起一个"别名"。

操作引用与操作原变量完全一样。

【问题】指针和引用的区别?

复制代码
#include <iostream>`

`using namespace std;`

`int main()`
`{`
`    int a = 1;`
`    // b是a的引用`
`    int &b = a;`

`    cout << a << " " << &a << endl; // 1 0x61fe88`
`    cout << b << " " << &b << endl; // 1 0x61fe88`

`    return 0;`
`}`


`

1.2 引用的性质

可以改变引用的值,但是不能再次成为其他变量的引用。

复制代码
#include <iostream>`

`using namespace std;`

`int main()`
`{`
`    int a = 1;`
`    // b是a的引用`
`    int &b = a;`
`    int &c = a;`

`    b = c;  // 只是赋值,不是引用,b还是a的引用`
`    a = 2;`

`    cout << a << " " << &a << endl; // 2 0x61fe88`
`    cout << b << " " << &b << endl; // 2 0x61fe88`
`    cout << c << " " << &c << endl; // 2 0x61fe88`

`    return 0;`
`}`

`

● 声明引用时,必须要初始化

复制代码
#include <iostream>`

`using namespace std;`

`int main()`
`{`
`    int a = 1;`
`//    int &b; // 引用必须要初始化`

`    cout << a << " " << &a << endl; // 2 0x61fe88`

`    return 0;`
`}`


`

● 声明引用时,不能初始化为null

复制代码
#include <iostream>`

`using namespace std;`

`int main()`
`{`
`    int a = 1;`
`//    int &b = NULL; // 错误,引用不能初始化null`
`//    int &b = nullptr; // 错误,引用不能初始化为nullptr`
`    cout << a << " " << &a << endl; // 2 0x61fe88`

`    return 0;`
`}`
`

● 声明引用的时候,初始化的值可以是纯数值,但是此时需要使用const关键字修饰,表示该引用为常量引用,这样引用的值不可变。

复制代码
#include <iostream>`

`using namespace std;`

`int main()`
`{`
`    const int &b = 12;  // 常量引用`
`//    b = 222; // 错误,常量引用的数值不能被改变`
`    cout << b << " " << &b << endl;`

`    return 0;`
`}`

`

● 可以将变量引用的地址赋值给一个指针,此时指针指向还是原来的变量。

复制代码
#include <iostream>`

`using` `namespace std;`

`int` `main()`
`{`
    `int a =` `1;`
    `int` `&b = a;`
    `int` `*c =` `&b;`    `// c同时指向了A和B`

`    cout << a <<` `" "` `<<` `&a << endl;` `// 1 0x61fe84`
`    cout << b <<` `" "` `<<` `&b << endl;` `// 1 0x61fe84`
`    cout <<` `*c <<` `" "` `<< c << endl;` `// 1 0x61fe84`

    `return` `0;`
`}`
`

● 可以使用const修饰引用,此时如果原变量的值改变,引用的值也改变。

复制代码
#include <iostream>`

`using` `namespace std;`

`int` `main()`
`{`
    `int a =` `2;`
    `const` `int` `&b = a;`
`//    b = 32; // 错误b是只读的`
`    a++;`

`    cout << a <<` `" "` `<<` `&a << endl;` `// 3 0x61fe88`
`    cout << b <<` `" "` `<<` `&b << endl;` `// 3 0x61fe88`

    `return` `0;`
`}`

`

1.3 引用参数

【思考】

写一个函数,函数有两个参数a和b,函数的功能是交换两个传入的参数原来变量的值。

复制代码
#include <iostream>`

`using namespace std;`

`// 操作的是拷贝的副本,不符合需求`
`void test(int a,int b)`
`{`
`    int temp = a;`
`    a = b;`
`    b = temp;`

`    cout << "a =" << a << endl;`
`    cout << "b =" << b << endl;`
`}`

`// C语言 再C++中不推荐这样写`
`void test1(int *a, int *b)`
`{`
`    *a = *a ^ *b;`
`    *b = *a ^ *b;`
`    *a = *a ^ *b;`
`}`

`// C++编程方式,符合需求`
`void test2(int &a, int &b)`
`{`
`   a = a ^ b;`
`   b = a ^ b;`
`   a = a ^ b;`
`}`

`int main()`
`{`
`    int a1 = 1;`
`    int b1 = 2;`

`    test2(a1,b1);`
`    cout << a1 << endl;`
`    cout << b1 << endl;`

`    return 0;`
`}`

`

引用作为参数进行定义的时候,在参数传递时,是不会产生副本的,这样会提高运行效率。我们在正常编程当中,建议使用引用进行传递参数。

引用参数,在不参与计算的情况下,我们建议使用const进行修饰,以达到引用的安全性。防止参数在函数内进行不必要的操作,或者是误操作。

2、 赋值(熟悉)

通常编程中使用=进行赋值操作,C++新增了以下赋值语法。

复制代码
#include <iostream>`

`using namespace std;`


`int main()`
`{`
`    int a(10);  // 相当于 int a = 10;`
`//    a(20); // 只能用于初始化`
`    cout << a << endl;`

`    int b(a);   // int b = a;`
`    cout << b << endl;`

`    int c(a+b); // int c = a + b;`
`    cout << c << endl;`


`    return 0;`
`}`

`

在C++11中对上述写法进行了升级。

复制代码
#include <iostream>`

`using namespace std;`


`int main()`
`{`
`    double b = 3.14;`
`    int b1 = b;`
`    cout << b1 << endl; // 3`

`    int b2(b);`
`    cout << b2 << endl; // 3`

`    int b3{b};`
`    cout << b3 << endl; // 3`


`    return 0;`
`}`

`

升级:对数据窄化做出警告。

3、 键盘输入(熟悉)

可以使用cin把用户在命令行中的内容赋值到变量中。

cin和cout一样,都属于头文件iostream中的标准输入输出流。

复制代码
#include <iostream>`

`using namespace std;`


`int main()`
`{`
`    int a;`

`    // C++的字符串是string`
`    string str;`

`    cout << "请输入一个数字和字符串" << endl;`
`    cin >> a >> str;    // 接收键盘输入,一个整数和字符串,可以连续操作`

`    cout << a << str << endl;`

`    return 0;`
`}`

`

如果cin输入的字符串需要包含空格,则可以使用下面的方式:

复制代码
#include <iostream>`

`using namespace std;`


`int main()`
`{`
`    // C++的字符串是string`
`    string str;`

`    cout << "请输入字符串,可以包含空格,输入完成后点击回车" << endl;`
`    getline(cin,str);   // 第二个参数只能是string类型`

`    cout << str << endl;`

`    return 0;`
`}`
`

4、 string字符串类(掌握)

string不是C++的基本数据类型,它是一个C++标准库中的字符串类,使用时需要引入对应的头文件,#include<string>,而不是string.h.

string在绝大多数情况下,可以代替C语言中字符串,不必担心内存是否足够字符串长度等等。其中内部还包含了很多字符串处理函数,可以完成各种情况下的字符串处理功能。

string和C语言相同,字符串编码使用ASCII编码,不支持中文。

复制代码
#include <iostream>`

`using namespace std;`


`int main()`
`{`
`    string str = "helloworld";`

`    cout << str << endl;`
`    cout << str.size() << endl; // 10`
`    cout << str.length() << endl;   // 10`

`    cout << str[1] << endl; // e`
`    cout << str.at(1) << endl;  // e`
`    return 0;`
`}`

`

两种方式都可以,但是在C++当中,更推荐你使用at函数,原因时at函数更安全。但是[ ]的方式效率更高。

复制代码
#include <iostream>`

`using` `namespace std;`

`int` `main()`
`{`
`    string str =` `"helloworld";`

`    cout << str[100]` `<< endl;` `// 输出一个越界数据`
`    cout << str.at(100)` `<< endl;`  `// 会报一个异常,程序运行停止`

`    cout <<` `"hello"` `<< endl;`
    `return` `0;`
`}`

`

string类支持多种遍历方式

● 普通循环(以for循环为主)

● C++11:for each循环

复制代码
#include <iostream>`

`using` `namespace std;`


`int` `main()`
`{`
`    string str =` `"helloworld";`

    `// 以for循环的方式进行输出字符串`
    `for(int i =` `0; i < str.length(); i++)`
    `{`
`        cout << str.at(i);`
    `}`
`    cout << endl;`

    `// 以 for each的方式进行循环遍历字符串`
    `for(char i:str)`
    `{`
`       cout << i;`
    `}`

    `return` `0;`
`}`
`

字符串与数字转换

复制代码
#include <iostream>`
`#include <sstream> // 字符串流`

`using namespace std;`

`int main()`
`{`
`    string s = "123";`
`//    int i = s; 错误`

`    // string → int`
`    istringstream iss(s);`
`    int i;`
`    iss >> i;`
`    cout << i << endl;`    `// 123`

`    // int → string`
`//    string s2 = i; 错误`
`    stringstream ss;`
`    ss << i;`
`    string s2 = ss.str();`
`    cout << s2 << endl;`

`    return 0;`
`}`

`

5、函数

5.1 内联函数(掌握)

内联函数用于取代C语言中宏定义的函数,内联函数的正确使用可以提升程序的执行效率。内联函数在编译的时候,直接把函数体展开到主函数中编译,在运行期间可以减少调用的开销。

通常将具有以下性质的函数写为内联函数:

● 代码长度5行以内

● 不包含复杂的控制语句

● 频繁被调用

关键字:inline

复制代码
#include <iostream>`

`using` `namespace std;`

`// 内联函数`
`inline` `void` `pint_string(string str)`
`{`
`    cout << str << endl;`
`}`

`int` `main()`
`{`
    `pint_string("hello world");`

    `return` `0;`
`}`

`

后续学习的成员函数默认都添加inline修饰。

但是我们手动添加上了inline关键字,将函数声明成内联函数。这个不是我们可以决定的。编译器有自己的判断准则,我们只是给编译器提供一个建议,具体是否为内联函数,还是编译器自己决定的。

5.2 函数重载 overload(重点)

C++中允许多个函数使用同一个名称,这种用法就是函数重载。函数重载要求函数名称相同,但是参数不同(类型、数量、前后顺序不同)。与返回值等其他因素无关。

复制代码
#include <iostream>`

`using namespace std;`

`void print_show(int i)`
`{`
`    cout << "调用了int重载"<< i << endl;`
`}`

`void print_show(float i)`
`{`
`    cout << "调用了float重载"<< i << endl;`
`}`

`void print_show(double i)`
`{`
`    cout << "调用了double重载"<< i << endl;`
`}`

`void print_show(string str)`
`{`
`    cout << "调用了string重载"<< str << endl;`
`}`

`void print_show()`
`{`
`    cout << "调用了无参int重载"<< endl;`
`}`

`int main()`
`{`
`    print_show(1);`

`    return 0;`
`}`
`

5.3 哑元函数(熟悉)

函数的参数只有类型,没有名称,这样参数的就是哑元函数。

复制代码
#include <iostream>`

`using` `namespace std;`

`// 哑元函数`
`void` `print_show(int)`
`{`
`    cout <<` `"调用了int的哑元函数"` `<< endl;`
`}`

`int` `main()`
`{`
    `print_show(56);`

    `return` `0;`
`}`


`

作用一:哑元函数用来区分函数重载。

作用二:运算符重载中用到。

复制代码
#include <iostream>`

`using` `namespace std;`

`// 哑元函数`
`void` `print_show(int i,int)`
`{`
`    cout <<` `"调用了int的哑元函数"` `<< endl;`
`}`

`void` `print_show(int i)`
`{`
`    cout <<` `"调用了int的哑元函数"<< i << endl;`
`}`


`int` `main()`
`{`
    `print_show(56,23);`

    `return` `0;`
`}`

`
相关推荐
legend_jz9 分钟前
【Linux】线程控制
linux·服务器·开发语言·c++·笔记·学习·学习方法
嘿BRE18 分钟前
【C++】几个基本容器的模拟实现(string,vector,list,stack,queue,priority_queue)
c++
tangliang_cn30 分钟前
java入门 自定义springboot starter
java·开发语言·spring boot
莫叫石榴姐30 分钟前
数据科学与SQL:组距分组分析 | 区间分布问题
大数据·人工智能·sql·深度学习·算法·机器学习·数据挖掘
程序猿阿伟30 分钟前
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
java·开发语言·前端
新知图书41 分钟前
Rust编程与项目实战-模块std::thread(之一)
开发语言·后端·rust
威威猫的栗子43 分钟前
Python Turtle召唤童年:喜羊羊与灰太狼之懒羊羊绘画
开发语言·python
力透键背44 分钟前
display: none和visibility: hidden的区别
开发语言·前端·javascript
bluefox19791 小时前
使用 Oracle.DataAccess.Client 驱动 和 OleDB 调用Oracle 函数的区别
开发语言·c#
ö Constancy1 小时前
c++ 笔记
开发语言·c++