6. C++对C语言的增强

6.1. 全局变量的检测增强

int a;

int a=10;

C语言中全局变量可以编译通过,但是C++中会失败,显示重定义。

6.2. 函数检测增强,参数类型增强,返回值检测增强,函数调用参数检测增强(增强的意思就是必须要有)

int getRectS(int w,int h)

{

return w*h;

}

6.3. 类型的转换检测增强

void test03()

{

char *P = malloc(sizeof(64)); //malloc返回值是void *

}

C++中必须要有强制类型转换(char *)malloc(sizeof(64));

6.4. struct增强

struct Person

{

int m_Age;

void plusAge(); // C++中struct可以加函数

}

void test04()

{

struct Person p1; // C语言使用时必须加入struct关键字

Person p2; // C++使用的时候可以不加

}

6.5. bool类型增强

C语言中没有bool类型

bool flag = true; // 只有真(1)或假(0)

void test05()

{

cout << sizeof(bool) << endl; // 1

flag = 100;

cout << flag << endl; // 1

}

6.6. 三目运算符增强

void test06()

{

int a = 10;

int b = 20;

//printf(" ret = %d\n",a>b?a:b);

cout << "ret = " << (a>b?a:b) << endl; // ret = 20

cout << "ret = " << (a>b?a:(b=100)) << endl; // ret =100

}

C语言中返回的是值,C++返回的是变量

6.7. const增强

const int m_A = 10; //全局变量和C语言一样。不能修改值,只读

void test07()

{

const int m_B = 20; // 真正常量,不能修改

int *p = (int *)&m_B;

*p = 200;

cout << "*p = " << *p << endl; // 200

cout << "m_B = " << m_B << endl; // 20

}

C语言中,const修饰的变量,是伪常量,编译器是会分配内存的。

C++中,const不会分配内存。

C语言中const默认外部链接,C++默认内部链接(只有当前文件夹下)。

6.8. const分配内存的情况

// 1、const分配内存 取地址会临时分配内存

void test01()

{

const int m_A = 10;

int *p = (int *)&m_A;

}

// 2、extern编译器也会给const变量分配内存

// 3、用普通变量初始化const的变量

void test02()

{

int a = 10;

const int b = a; // 会分配内存

}

// 4、自定义数据类型

struct Person

{

string m_Name; // 姓名

int m_Age;

}

void test03()

{

const Person p1;

Person *p = (Person *)&p1;

p->m_Name = "德玛西亚";

(*p).m_Age = 18;

cout << "姓名:" << p1.m_Name << endl;

cout << "年龄:" << p1.m_Age << endl;

}

int main()

{

test03();

}

会不会分配内存就看能不能用指针进行修改值。

7. 引用

引用就是取别名!!!

int &b = a;

&写到左侧,叫引用,写到右侧,取地址。

// 1、引用基本语法 Type A别名 = 原名

void test01()

{

int a = 10;

int &b = a;

b = 20;

cout << "a=" << a << endl; // 20

cout << "b=" << b << endl; // 20

}

// 2、引用必须初始化

void test02()

{

// int &a; 必须初始化

int a = 10;

int &b = a; // 引用初始化后不可以修改了

}

// 3、对数组建立引用

void test03()

{

int arr[10];

for(int i = 0; i<10; i++)

{

arr[i]=i;

}

// 给数组取别名

int (&pArr)[10] = arr;

for(int i = 0; i<10; i++)

{

cout << "pArr[i]" << " ";

}

cout << endl;

// 第二种方式,取别名

typedef int(ARRAYREF)[10]; // 一个具有10个元素的int类型的数组

ARRAYREF & pArr2 = arr;

}

8. 参数的传递方式

// 1、值传递

void mySwap(int a,int b)

{

int tmp = a;

a = b;

b = tmp;

cout << "mySwap::a=" << a << endl; // 20

cout << "mySwap::b=" << b << endl; // 10

}

void test01()

{

int a = 10;

int b = 20;

mySwap(a,b); // 值传递

cout << "a=" << a << endl; // 10

cout << "b=" << b << endl; // 20

}

// 2、地址传递

void mySwap2(int *a,int *b)

{

int tmp = *a;

*a = *b;

*b = tmp;

}

void test02()

{

int a = 10;

int b = 20;

mySwap2(&a,&b); // 地址传递

cout << "a=" << a << endl; // 20

cout << "b=" << b << endl; // 10

}

// 3、引用传递(类似传地址)

void mySwap3(int &a,int &b) // &a = a &b =b

{

int tmp = a;

a = b;

b = tmp;

}

void test03()

{

int a = 10;

int b = 20;

mySwap3(a,b); // 引用传递

cout << "a=" << a << endl; // 20

cout << "b=" << b << endl; // 10

}

引用的注意事项:

1、 引用必须引用一块合法的内存空间;

2、 不要返回一个局部变量的引用

引用的本质在C++内部实现是一个指针常量。

Type & ref = val ; // Type * const ref = &val;

9. 引用的应用场景(指针的引用)

C语言:指针的应用

struct Person

{

int m_Age;

}

void allocatMemoey( Person **p ) // **p 具体的Person对象 *p 对象的指针 p 指针

{

*p = (Person *)malloc(sizeof(Person));

(*p)->m_Age = 100;

}

void test01()

{

Person *p = NULL;

allocatMemoey(&p);

cout << "P的年龄:" << p->m_Age << endl;

}

C++:引用的应用

void allocatMemoryByRef(Person * &p)

{

p = (Person *)malloc(sizeof(Person));

p->m_Age = 1000;

}

void test02()

{

Person *p = NULL;

allocatMemoryByRef(p);

cout << "P的年龄:" << p->m_Age << endl;

}

10. 引用的应用场景(常量引用)

void test01()

{

const int &ref = 10;

// 加入const后,编译器处理方式为 int tmp = 10; const int ref = tmp;

// ref = 10; 不能直接修改

int *p = (int *)&ref;

*p = 1000;

cout << "ref= " << ref << endl;

}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐