C 与 C++

https://www.bilibili.com/video/av18629275?p=4

C++比C多了什么

C++比C新增数据类型

  • auto
  • long long
  • bool 布尔类型
  • wchar_t 宽字符
  • class 类类型
  • & 引用类型

C++比C新增的关键字,C语言关键字32个。

面向对象特性

  • 类:封装、继承、多态、重载、抽象
  • 对象

泛型编程特性

  • 模板
  • 泛型

结构体

  • C的结构体不允许有函数的存在,C++允许有内部成员函数,且允许该函数为虚函数。所以C的结构体是没有构造函数、析构函数、this指针等。
  • C的结构体对内部成员变量的访问权限只能是public,C++允许public、protected、private三种。
  • C语言的结构体是不可继承的,C++的结构体是可以从其他的结构体或类继承过来的。

typeid

typeid() 操作符的作用是获取一个表达式的类型,返回结果是const type_info&类型。不同编译器实现的type_info class各不相同,但C++标准保证它会实现一个name()方法,该方法返回类型名字的c-style字符串。

使用方法:typeid(类型或变量或表达式).name() //返回类型名字的字符串

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
using namespace std;

struct User
{
    string username;
    string nickname;
};

int main()
{
    //输出类型名称
    cout << typeid(int).name() << endl;//int
    cout << typeid(User).name() << endl;//struct User
    //输出变量类型
    char c = 'a';
    cout << typeid(c).name() << endl;//char
    //输出表达式类型
    cout << typeid(3.14 * 2).name() << endl;//double
    //输出字符串类型
    cout << typeid("hello").name() << endl;//char const [6]
    //输出指针类型
    int *p = NULL;
    cout << typeid(p).name() << endl;//int *
    //输出常量类型
    const char *pc = NULL;
    cout << typeid(pc).name() << endl;//char const *

    return 0;
}

C++新增类型

wchar_t 类型

wchar_t类型主要用在国际化程序的实现中,unicode编码的宽字符一般以wchar_t类型存储。

char类型与wchar_t类型的区别

区别

字母L告诉编译器该字符作为wchar_t字符串来编译

#include 
using namespace std;

int main()
{
    //单字节字符
    char c = 'A';
    //宽字节字符
    wchar_t w = L'A';
    //输出大小
    cout << c << " byte is " << sizeof(c) << endl;//1
    wcout << w << " byte is " << sizeof(w) << endl;//2
    //中文输出
    wchar_t cn = L'中';
    wcout.imbue(locale("chs"));//默认Locale为EN_US,需设置为ch。
    wcout << cn << " byte is " << sizeof(cn) << endl;

    return 0;
}

bool类型

  • 布尔类型,占1个字节,0表示假,非0表示真,用于条件判断。
  • false/true是标准C++语言中新增的关键字,是bool类型。
#include 
using namespace std;

int main()
{

    bool flag = false;
    cout << "flag size is " <

long long 类型

long占4个字节,long long占8个字节,实现了32位机器上可扩展8字节的数据。

引用

C++引入了“引用类型”,即一个变量是另一个变量的别名。

#include 
using namespace std;

int main()
{
    double pi = 3.1415927;
    //设置p为pi的别名
    double &p = pi;//&p表示定义引用变量
    //设置p的内存块值
    p = 100;
    
    cout << p << endl; //100
    cout << pi << endl; //100

    return 0;
}

引用变量可用作函数的形式参数,表示形参和实参实际上是同一个对象。在函数中对形参的修改,也是对实参的修改。

C语言中实现变量互换值

#include 
using namespace std;

void swap(int *x, int *y)
{
    int t = *x;
    *x = *y;
    *y = t;
}

int main()
{
    int x = 100;
    int y = 200;
    swap(&x, &y);
    cout << x << " " << y << endl;
}

C++使用引用实现变量互换值

#include 

using namespace std;
// x和y表示实参的引用
void swap(int &x, int &y)
{
    int t = x; x = y; y = t;
}

int main()
{
    int x = 100, y = 200;
    swap(x, y);
    cout << x << " " << y << endl;//200 100
}

当实参占据的内存比较大的时候,使用引用代替传值(需复制)可提高效率。若不希望因此“无意中”修改了实参,可用const修改符。

#include 

using namespace std;

// &表示实参的引用,const表示不可修改。
void init(int &x, const int &y)
{
    x = 100;
}

int main()
{
    int x, y;
    init(x, y);
    cout << x << " " << y << endl;//100 6422368
}

内联函数

对于不包含循环的简单函数,建议使用inline关键字声明为内联函数。编译器将内联函数调用使用其代码展开,称为内联展开,避免函数调用开销,提高程序执行效率。即不将其作为函数而是直接作为表达式来使用。

//内联函数
inline double distance(double x, double y)
{
    return sqrt(x*x + y*y);
}

异常处理

C++通过try-catch处理异常情况,正常代码放在try块,catch中捕获try块抛出的异常。

#include 
using namespace std;

int main()
{
    int value = 0;

    cout << "Enter Value : ";
    cin >> value;

    try
    {
        if(value > 100){
            throw 1;
        }
        if(value < 0){
            throw 0;
        }
        throw value/2;
    }catch(int result){
        cout << "Result is " << result << endl;
    }

    return 0;
}

https://www.bilibili.com/video/av18629275/?p=5

默认形参

函数的形参可带默认值,必须一律在最右边。

double test(double x=0, double y=0)
{
    return x-y;
}

函数重载

C++允许函数同名,只要它们的形参不一样,即个数或对象参数类型不同。调用函数时将根据实参和形参的匹配选择最佳函数,如果有多个难以区分的最佳函数,则变化一起报错。注意的是不能根据返回类型来区分同名函数。

运算符重载

模板函数

模板template函数,厌倦了对每种类型求最小值。

#include 

using namespace std;
// 可对任何能比较大小的类型使用该模板
// 让编译器自动生成一个针对该数据类型的具体函数
template
T tmin(T x, T y)
{
    return x
#include 
using namespace std;

template
T1 tmin(T1 x, T2 y)
{
    return x

动态分配内存

C++关键字newdelete比C语言的mallocallocreallocfree更好,可以对类对象调用初始化构造函数或销毁析构函数。

堆存储区:mallocallocreallocfree

#define _CRT_SECURE_NO_WARNINGS //windows
#include 
#include 
using namespace std;

int main()
{
    double d = 3.14; 
    double *dp; 
    dp = &d; 
    *dp = 4.14;
    cout<<"d="<

输出值

d=4.14
&d=0x61ff10
*dp=4.14
dp=0x61ff10

代码解析

 double d = 3.14; 

变量d是一块存放double类型值的内存块

double *dp;

指针变量dp表示保存double类型的地址变量,dp值的类型是double *, dp是存放double *类型值的内存块。

dp = &d; // 0x61ff10

取地址运算符&用于获取变量的内存地址,将double变量d的内存地址(指针)保存到double*指针变量dp中,dp&d的类型都是double *

*dp = 4.14;

解引用运算符*用于获得指针变量指向的那个变量

https://www.bilibili.com/video/av18629275/?p=9

你可能感兴趣的:(C 与 C++)