第二节 C/C++简述

2.1 第一个C++程序

#include <iostream>    // 系统输入输出流头文件,也可以写成“#include <iostream.h>”,类似于#include <stdio.h>。
// 注意:系统头文件可以不带“.h”,但是引入自己的头文件不可以省略。
using namespace std;    // std:标准,该句代码表示使用标准命名空间

// 主函数
int main()
{
    cout << "Hello World! 你好中国!" << endl;    // endl类似于C语言中的换行符“\n”。
    // cout代表的是输出设备,类似于C语言中的printf;<< 表示该内容指向(流向)输出设备,在endl后面一样可以拼接;
    // cin代表的是输入设备,类似于C语言中的scanf;比如:
    int num = 0;
    cin >> num;    // 将键盘输入的数据赋值给num
    cout << "num = " << num << endl;
    return 0;
}

/**********************************************************************************************************
 * C和C++的对比:
 * 1. C语言是面向过程的语言:其核心思想是功能分解,自顶向下,逐层细化,程序=数据结构+算法;
 *     数据结构:表示对数据的存储方式,即数据类型(int long short char string float struct array 链表等);
 *     算法:就是对存储号的数据进行分析的步骤,即功能函数。
 * 2. C++是面向对象的语言:其核心思想是功能模块化(类的封装和继承),即每个模块只提供一种特定的功能,各模块之间相互独立,
 * 该方法增加了代码的复用率,有利于软件的开发、维护和升级。对象=数据结构+算法=对象+对象+对象+……
 **********************************************************************************************************/

2.2 C++的三大特性

  1. 封装:
    指把客观的事物封装成抽象的类,且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行数据信息隐藏。类将成员变量和成员函数封装在类的内部,根据需要设置访问权限,通过成员函数管理内部状态。

  2. 继承:
    指类之间的相互关系,继承的作用是子类拥有父类的特征和能力,避免公共代码的重复开发,减少代码和数据冗余。

  3. 多态:
    指“一个接口,多种方法”,即多种形态,程序在运行的过程中才决定调用的函数,它是面向对象的核心概念。

2.3 C++是C语言的扩展

#include <iostream>    // 系统输入输出流头文件,也可以写成“#include <iostream.h>”,类似于#include <stdio.h>。
// 注意:系统头文件可以不带“.h”,但是引入自己的头文件不可以省略。
using namespace std;    // std:标准,该句代码表示使用标准命名空间


/****************************************************************************************************
 * 1.全局变量的定义与使用:
 *     ① “::”表示作用域运算符(C++独有,C没有);
 ****************************************************************************************************/
int a = 30;    // 全局变量
void test01()
{
    int a = 40;    // 局部变量
    cout<<"局部变量a="<<a<<endl;    // 就近优先选择局部变量
    cout<<"全局变量a="<<::a<<endl;    // 此时就选择全局变量
}

/****************************************************************************************************
 * 2.命名空间的定义与使用,命名空间内可以使变量,也可以是函数等内容:
 *     ① 只能在全局范围内定义;
 *     ② 命名空间可嵌套;
 *     ③ 命名空间是开放的,可以随时添加新成员进去;
 *     ④ 命名空间中的函数,可以在该命名空间外部定义;
 *     ⑤ 无名命名空间:“namespace {}”,表示该命名空间只能在本文件内访问使用,相当于该其添加了static,使其作为内部
 * 链接,不建议使用该命名空间;
 *     ⑥ 给命名空间取一个别名;
 ****************************************************************************************************/
namespace{    // 无名命名空间
    int b = 25;
    void func()
    {
        cout << "无名命名空间中的func遍历b = " << b << endl;
    }
}
namespace A {    // 定义一个名字为A的命名空间
    int a = 10;
}
namespace B {
    int a = 20;
    int b = 35;
    void func(){    // 定义命名空间中的函数
        cout << "命名空间B中的func遍历a = " << a << endl;    // 这里的a就是B::a,访问同一命名空间内的内容a不用加作用域运算符
    }
}
namespace C {
    int a = 50;
    namespace D {
        int a = 60;
    }
}
namespace A {    // 表示往命名空间A中添加新元素,也可以直接在上面命名空间内添加
    int b = 15;
    void func();    // 在命名空间外编辑成员函数内容,但是需要在命名空间内声明该函数
}
void A::func()    // 在命名空间外定义该编辑空间的成员函数。
{
    cout << "func遍历b = " << b << endl;    // 这里的a就是B::a,自己家的a不需要再加作用域运算符
}
namespace veryLongName {
    int c = 11;
    void func(){
        cout << "func遍历c = " << c << endl;
    }
}

int test02()
{
    func();    // 调用无名命名空间中的函数
    cout << "A::a = :" << A::a << endl;
    cout << "B::a = :" << B::a << endl;
    B::func();    // 调用命名空间B中的函数
    cout << "C::D::a = " << C::D::a << endl;
    A::func();

    // 给命名空间取别名
    namespace vLN = veryLongName;
    vLN::func();
    return 0;
}

/****************************************************************************************************
 * 3.using声明的使用:using编译指令是整个命名空间标识符在该作用空间中可用。
 *     ① 即当我们两个命名空间中都有相同的变量,但是相同变量的值不同,我们如果在某个方法中需要使用某特定的值,我们直接
 * 在该方法开始书写“using namespace A”即可;
 *     ② 缺点是容易冲突,仔细使用;
 *     ④ using namespace A:凡是在本方法中没有定义的变量或方法,在缺省条件下都使用命名空间A中的变量或方法,如果命
 * 名空间中也没有,就从全局查找并使用。
 *     ③ 指明使用命名空间中的某个成员:using B::b;
 ****************************************************************************************************/
void test03()
{
    using namespace B;    // 使用命名空间B
    using B::b;    // 使用命名空间B中特定的元素b
    cout << "命名空间B中的b = " << b << endl;
}

/****************************************************************************************************
 * 4.C++语法增强:
 *     ① C++是强语法语言,所以在函数定义和参数传值的时候必须严格定义函数返回值类型(即函数开头的类型)和传值类型(形
 * 参的类型);
 *     ② C语言中可以不定义形参类型,此时传入的实参可以使任意类型。
 * 5.C++严格的类型转换:不同类型的变量一般是不能直接赋值的,需要相应的强转。
 * 6.C++结构体:
 *     ① 定义结构体时C/C++都需要有关键词“struct”关键词修饰;
 *     ② 在使用结构体时,C++不需要加关键字“struct”,使用修饰也不会报错,而C需要修饰;
 *     ③ 结构体成员既可以是成员变量,也可以是是成员函数,而C只能定义成员变量。
 ****************************************************************************************************/
struct Student{    //定义结构体
    string mName;    // 成员变量
    int mAge;
    void setName(string name){ mName = name; }    // 成员函数
    void setAge(int age){ mAge = age; }    // 严格的类型定义,表现了C++的强语法性
    void showStudent(){ cout << "Name:" << mName << endl << "Age:" << mAge << endl; }
};
void test04()
{
    Student stu;    // 使用结构体时,不需要struct关键词修饰。此句表示引用结构体,并给其取个别名stu
    stu.setName("John");    // 给结构体函数传参,并调用结构体函数
    stu.setAge(20);
    stu.showStudent();
}

/****************************************************************************************************
 * 7.新增“bool”类型关键字:true和false,分别存储为1和0,占一个字节。
 *     ① 其实C语言的C99版本开始有bool类型,但是需要引入包含头文件“stdbool.h”,就可以使用和C++一样的bool类型了。
 * 8.三目运算符:a>b?a:b,在C语言中返回的是数值(即变量的值),而在C++中返回的是变量本身(引用)。
 * 9.C++中的const:
 *     ① 字面意思,常数,不变的数值,它是一个限定符,用来限定一个变量不允许改变,将一个对象转换成一个常量;
 *     ② C++中用const修饰的常量是内部链接常量,即只在本文件中起作用,外部文件不可见(可使用external修饰,用于外部使
 * 用),而C中为外部链接,可外部使用;
 *     ③ C++中const表示常量,不需要分配内存长度,而C中表示只读变量,需要分配内存长度;
 *     ④ C++中全局const,当声明extern或者对变量进行取地址时,编译器会为其分配内存空间,变量存储在只读数据段,否则不
 * 开辟内存空间,内存中的数据不可修改;
 *     ⑤ 当以变量的形式初始化const修饰的变量时,系统也会为其分配内存空间,如“const int a=b;”,系统直接为a开辟空间
 * 而不创建符号表中;
 *     ⑥ 对于自定义数据类型,如类对象,也会分配内存空间,如:const Person person;
 *     ⑦ 尽量用const替换宏(#define)。
 * 10.C中的const:
 *     ① const修饰的全局变量,变量名只读,内存空间在文学常量区(只读),不可修改;
 *     ② const修饰的局部变量,变量名只读,内存分配在栈区(可读写),可通过寻访变量地址来简介修改空间内容;
 ****************************************************************************************************/
void test05()
{
    cout << sizeof (false) << endl;    // 输出结果为1,表示bool类型占一个字节大小
    bool flag = true;    // C语言中没有这种类型
    flag = 100;    // 给bool类型赋值时,非0值会自动转换成true(1),0值直接转换成false(0)
    cout << flag << endl;    // 输出结果为1

    // C++中的const
    const int constA = 10;    // 给常量赋值,变量名和值存于符号常量表,此时还没有开辟内存空间
    cout << "constA:" << constA << endl;    // 输出结果为10,输出符号表中的值
    int* p = (int*)&constA;    // 寻访变量constA的地址,此时给constA开辟内存空间,并将constA=10存储在开辟的内存空间中
    *p = 300;    // 并修改constA地址中的值
    cout << "*p:" << *p << endl;    // 输出结果为300,表示修改成功
    cout << "constA:" << constA << endl;    // 输出结果仍为10,输出的是符号表中的值,但地址中的值已经被修改。
    cout << "*&constA:" << &constA << endl;    // 输出结果为:0x61feb8,存储地址
    cout << "*p:" << *&p << endl;    // 输出结果为:0x61feb8,存储地址

    const Student stu = {"Han", 27};
    cout << "stu.Name: " << stu.mName << endl << "stu.Age: " << stu.mAge << endl;
}


// 主函数
int main()
{
    /*************************************************************************************************
    cout << "Hello World! 你好中国!" << endl;    // endl类似于C语言中的换行符“\n”。
    // cout代表的是输出设备,类似于C语言中的printf;<< 表示该内容指向(流向)输出设备,在endl后面一样可以拼接;
    // cin代表的是输入设备,类似于C语言中的scanf;比如:
    int num = 0;
    cin >> num;    // 将键盘输入的数据赋值给num
    cout << "num = " << num << endl;
    **************************************************************************************************/
    // test01();
    // test02();
    // test03();
    // test04();
    test05();
    return 0;
}
posted @ 2022-05-21 19:37  漠上  阅读(145)  评论(0编辑  收藏  举报