C++概述(二)

一,函数库

C++从C语言演变而来。在C++程序中可以使用C语言的函数库。  

 如果要用函数库中的函数,就必须在程序文件中包含有关的头文件。    

在C++中使用这些 头文件有两种方法。
1、用C语言的传统方法 #include<stdio.h> #include<math.h> 
2、用C++的新方法 C++标准要求系统提供的头文件不包括后缀.h,例如iostream、string。 为了表示与C 语言的头文件有联系又有区别,C++所用的头文件名是在C语言的相应的头文件名之前加一字母c

因为标准库非常的庞大,所以程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。 为了避免名字冲突,98年以后的c++语言提供一个全局的命名空间namespace就把标准库中的一切都被放在名字空间std中,因此在程序中要对命名空间std作声明

目前所用的大多数C++编译系统既保留了c的用法,又提供了C++的新方法。下面两种用法等价,可以任选。提倡使用C++的新方法。

二,namespace命名空间

使用基本io的时候要加入标准命名空间;using namespace std;
(1) namespace是指标识符的各种可见范围
(2) 命名空间用关键字namespace 来定义
(3) C++标准程序库中的所有标识符都被定义于一个名为std的namespace中

在C++中,名称(name)可以是: 符号常量、变量、宏、函数、结构、枚举、类和对象。

为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,标准C++引入了关键字namespace

namespace一般被译为:命名空间/名字空间/名称空间/名域

命名空间(namespace)是一种描述逻辑分组的机制,可以将按某些标准在逻辑上属于同一个集团的声明放在同一个命名空间中。命名空间可以是全局的,也可以位于另一个命名空间之中,但是不能位于类和代码块中

与命名空间相关的概念有:

  • 声明域(declaration region) :声明标识符的区域。如在函数外面声明的全局变量,它的声明域为声明所在的文件。在函数内声明的局部变量,它的声明域为声明所在的代码块(例如整个函数体或者整个复合语句)。
  • 潜在作用域(potential scope):从声明点开始,到声明域的末尾的区域。因为 C++ 采用的是先声明后使用的原则,所以在声明点之前的声明域中,标识符是不能用的。即,标识符的潜在作用域,一般会小于其声明域。
  • 作用域(scope):标识符对程序可见的范围。标识符在其潜在作用域内,并非在任何地方都是可见的。例如,局部变量可以屏蔽全局变量,嵌套层次中的内层变量可以屏蔽外层变量,从而被屏蔽的全局或外层变量在其屏蔽的区域内是不可见的。所以,一个标识符的作用域可能小于其潜在作用域。

定义: 一般自定义格式如下
 namespace  xxx            
{
  //作用域;
}          

注意:命名空间不能单独在函数内部定义
命名空间要在调用位置之前声明
命名空间可以分段定义,同一命名空间可以合并;

三,C++智能字符串string

C++的string类型是对C语言的字符串的极大提升,string类型是智能对象,能自动分配所需的内存空间,并且提供针对字符串的几乎所有操作。

所需要的头文件:<string>      C语言 --> <cstring>/<string.h>
所需声明的名字空间:using std::string;

比起C风格字符串来,特有的操作有:

  • 自动分配字符串内存空间
  • 双向遍历字符串迭代器
  • 清空字符串内容
  • 累加、追加、插入、交换等操作

C++ string类的常用操作:1、string初始化、赋值 2、str.c_str()、string 与 char*的转换 3、string的输入 4、capacity 5、size、length 6、max_size 7、clear 8、empty 9、erase 12、find 10、substr 11、swap 13、replace 14、字符串连接 15、字符串比较

示例代码:

#include <iostream>
#include <string>
using namespace std;

int main() {
    // 1. string 初始化、赋值
    string s1 = "Hello";              // 初始化
    string s2;                        
    s2 = "World";                     // 赋值
    cout << "1. s1 = " << s1 << ", s2 = " << s2 << endl;

    // 2. str.c_str()、string 与 char* 的转换
    const char* cstr = s1.c_str();    // 转换为 const char*
    cout << "2. c_str() = " << cstr << endl;

    // 3. string 的输入
    string s3;
    cout << "3. 请输入一个字符串: ";
    cin >> s3;   // 输入时遇到空格会结束
    cout << "你输入的是: " << s3 << endl;

    // 4. capacity 容量
    cout << "4. s1.capacity() = " << s1.capacity() << endl;

    // 5. size、length
    cout << "5. s1.size() = " << s1.size()
         << ", s1.length() = " << s1.length() << endl;

    // 6. max_size
    cout << "6. s1.max_size() = " << s1.max_size() << endl;

    // 7. clear
    s2.clear();
    cout << "7. 清空 s2 后: \"" << s2 << "\", size = " << s2.size() << endl;

    // 8. empty
    cout << "8. s2.empty() = " << (s2.empty() ? "true" : "false") << endl;

    // 9. erase
    string s4 = "abcdefg";
    s4.erase(2, 3);   // 从下标 2 开始删除 3 个字符
    cout << "9. erase 后 s4 = " << s4 << endl;

    // 10. substr
    string s5 = "HelloC++";
    cout << "10. substr(5, 3) = " << s5.substr(5, 3) << endl;

    // 11. swap
    string a = "AAA", b = "BBB";
    a.swap(b);
    cout << "11. swap 后 a = " << a << ", b = " << b << endl;

    // 12. find
    string text = "I love programming in C++";
    size_t pos = text.find("programming");
    if (pos != string::npos)
        cout << "12. find \"programming\" 成功,位置 = " << pos << endl;

    // 13. replace
    string s6 = "I like Java";
    s6.replace(7, 4, "C++"); // 从下标 7 开始,替换 4 个字符为 "C++"
    cout << "13. replace 后 s6 = " << s6 << endl;

    // 14. 字符串连接
    string s7 = "Hello", s8 = "C++";
    string s9 = s7 + " " + s8;
    cout << "14. 字符串连接: " << s9 << endl;

    // 15. 字符串比较
    string x = "abc", y = "abd";
    cout << "15. 比较 \"abc\" 和 \"abd\": ";
    if (x == y) cout << "相等" << endl;
    else if (x < y) cout << "abc < abd" << endl;
    else cout << "abc > abd" << endl;

    return 0;
}

运行结果:

四,C++之struct

1.C语言中struct和C++中struct的区别

1)C 语言中的 struct

  • 只能包含数据成员(变量),不能包含函数。
  • struct 定义后,变量声明时必须加上关键字 struct。
  • 成员默认的访问权限是 public(公共),但实际上 C 没有访问权限控制的概念。
  • 不支持继承和多态。
  • 初始化时一般用大括号整体赋值,成员访问用 . 或 ->。

示例代码:

#include <stdio.h>

struct Point {
    int x;
    int y;
};

int main() {
    struct Point p1 = {10, 20};   // 必须写 struct
    printf("x=%d, y=%d\n", p1.x, p1.y);
    return 0;
}

2)C++ 中的 struct

在 C++ 中,struct 和 class 非常相似,区别是:

1.默认访问权限:struct 的成员默认是 public,class 默认是 private
2.C++中结构体的默认继承方式是public
   C++中类的默认继承方式是private

除此之外,C++ 的 struct 能做的事和 class 基本相同:

  • 可以包含 数据成员 + 成员函数。
  • 可以有 构造函数 / 析构函数。
  • 可以有 静态成员。
  • 可以有 继承、多态、访问控制(public/private/protected)。

示例代码:

#include <iostream>
using namespace std;

struct Point {
    int x, y;

    // 构造函数
    Point(int a, int b) : x(a), y(b) {}

    // 成员函数
    void print() {
        cout << "x=" << x << ", y=" << y << endl;
    }
};

int main() {
    Point p1(10, 20);   // 直接用构造函数
    p1.print();
    return 0;
}

小结:

  • 在 C语言 中,struct 仅仅是“数据的集合”。
  • 在 C++ 中,struct 已经是一个轻量的“类”,几乎具备和 class 一样的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值