赞
踩
解决变量、函数和类的名称出现命名冲突的问题
- #define _CRT_SECURE_NO_WARNINGS 1
- #include<stdio.h>
- #include<stdlib.h>
- int rand = 0;
- int main()
- {
- printf("%d\n", rand);
- return 0;
- }
- //命名空间的嵌套定义
- namespace N1 //定义一个名为N1的命名空间
- {
- int a;
- int b;
- namespace N2 //嵌套定义另一个名为N2的命名空间
- {
- int c;
- int d;
- }
- }
- #include <iostream>
- namespace ly
- {
- // 自动识别类型
- int i = 11;
- double d = 22.33;
- }
-
- int main()
- {
- printf("%d,%lf", ly::i, ly::d);
- return 0;
- }
- #include <iostream>
- using std::cout;
- using std::endl;
- int main()
- {
- // 自动识别类型
- int i = 11;
- double d = 22.33;
-
- // >>流提取
- cout << i << "," << d << std::endl;
-
- return 0;
- }
- #include <iostream>
- using namespace std;
- int main()
- {
- // 自动识别类型
- int i = 11;
- double d = 22.33;
-
- // >>流提取
- cout << i << "," << d << std::endl;
-
- return 0;
- }
指在声明或定义函数时,为函数的参数指定一个默认值
在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参
- #include <iostream>
- using namespace std;
-
- void Print(int a = 10, int b = 20, int c = 30)
- {
- cout << a << endl;
- cout << b << endl;
- cout << c << endl;
- }
-
- int main()
- {
- int a = 0, b = 0, c = 0;
- Print();
- return 0;
- }
- #include <iostream>
- using namespace std;
-
- void Print(int a, int b, int c = 30)
- {
- cout << a << endl;
- cout << b << endl;
- cout << c << endl;
- }
-
- int main()
- {
- int a = 0, b = 0, c = 0;
- Print(a,b);
- return 0;
- }
C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表必须不同
- #include<iostream>
- using namespace std;
- double Add(double left, double right)
- {
- return left + right;
- }
-
- double Add(double right, double left)
- {
- return left + right;
- }
-
- int main()
- {
- cout << Add(1.1, 2.2) << endl;
- return 0;
- }
因为是同类型的,所以顺序改变是没有用的,编译器是不能区分的
- #include<iostream>
- using namespace std;
- short Add(short left, short right)
- {
- return left + right;
- }
-
- int Add(short left, short right)
- {
- return left + right;
- }
-
- int main() {
- cout << Add(1, 2) << endl;
- cout << Add(1, 2) << endl;
- return 0;
- }
返回值类型不同是不够成重载的,编译器是不能区分的
- #include<iostream>
- using namespace std;
- //两个函数类型不同
- //void Swapi(int* p1, int* p2)
- void Swap(int* p1, int* p2)
- {
- int tmp = *p1;
- *p1 = *p2;
- *p2 = tmp;
- }
-
- //void Swapd(double* p1, double* p2)
- void Swap(double* p1, double* p2)
- {
- double tmp = *p1;
- *p1 = *p2;
- *p2 = tmp;
- }
-
- int main()
- {
- int a = 1, b = 2;
- double c = 1.1, d = 2.2;
- Swap(&a, &b);
- Swap(&c, &d);
-
- cout << a;
- cout << c;
-
- return 0;
- }
首先我们知道程序翻译的最后一个过程是链接
C语言不能支持重载,是因为同名函数没办法区分。
而C++是通过函数修饰规则来区分的,只要函数的形参列表不同,修饰出来的名字就不一样,也就支持了重载。
另外我们也理解了,为什么函数重载要求参数不同,与返回值没关系。
给变量取了一个别名,不开辟空间
- #include<iostream>
- using namespace std;
- int main()
- {
- int a = 0;
- int& b = a;
- cout << &b << endl; // 取地址
- cout << &a << endl; // 取地址
- a++;
- b++;
- cout << b << endl;//2
- cout << a << endl;//2
- return 0;
- }
- #include<iostream>
- using namespace std;
- int main()
- {
- int a = 1;
- // int& b; // 1、引用在定义时必须初始化
-
- int& c = a;
- int& d = c;
-
- int& b = a; // 2、一个变量可以有多个引用
- ++a;
- cout << b << endl;
- cout << a << endl;
-
- int x = 10;
- // 3、引用一旦引用一个实体,再不能引用其他实体
- b = x; // 这里b不是x的别名,是把x赋值给a的别名b
- cout << b << endl;
- ++x;
- cout << x << endl;
- return 0;
- }
- #include<iostream>
- using namespace std;
- int& Count1()
- {
- int n = 0;
- n++;
- return n;
- }
-
- int& Count2()
- {
- static int n = 0;
- n++;
- return n;
- }
-
- int main() {
- int& ret1 = Count1();
- printf("ret1第一次:%d\n", ret1);
- printf("ret1第二次:%d\n", ret1);
- int& ret2 = Count2();
- printf("ret2第一次:%d\n", ret2);
- printf("ret2第二次:%d\n", ret2);
- return 0;
- }
出了作用域还在的——>传引用返回
出了作用域被销毁——>传值返回
权限不能放大,但是可以缩小,权限是支持平移的
- #include<iostream>
- using namespace std;
- int main()
- {
- int a = 10;
- int& b = a;
- cout << typeid(a).name() <<endl;//int
- cout << typeid(b).name() << endl;//int
-
- // 权限不能放大
- const int c = 20;
- int& d = c;//error
- //const int& d = c;
-
- // 权限可以缩小
- int e = 30;
- const int& f = e;
-
- int ii = 1;
- double dd = ii;
- double& rdd = ii;//error
- const double& rdd = ii;//正确
-
- const int& x = 10;
-
- return 0;
- }
- #include<iostream>
- using namespace std;
- int main()
- {
- // 语法的角度,ra没有开空间
- int a = 10;
- int& ra = a;
- ra = 20;
-
- // 语法的角度,pa开辟了4或8个字节的空间
- int* pa = &a;
- *pa = 20;
-
- return 0;
- }
- #include<iostream>
- using namespace std;
- inline void Add(int a, int b)
- {
- int c = a + b;
- printf("Add(%d, %d)->%d\n", a, b, c);
- }
-
- void Sub(int a, int b)
- {
- int c = a - b;
- printf("Sub(%d,%d)->%d\n", a, b, c);
- }
-
- int main()
- {
- Add(1, 2);
- Sub(1, 2);
-
- return 0;
- }
C++11 规定
auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,
auto声明的变量必须由编译器在编译时期推导而得。
场景一:auto与指针和引用结合起来使用
- #include<iostream>
- using namespace std;
- int main()
- {
- int x = 10;
- auto a = &x;
- auto* b = &x;
- auto& c = x;
-
- cout << typeid(a).name() << endl;
- cout << typeid(b).name() << endl;
- cout << typeid(c).name() << endl;
-
- *a = 20;
- *b = 30;
- c = 40;
-
- return 0;
- }
场景二:在同一行定义多个变量
- #include<iostream>
- using namespace std;
- void TestAuto()
- {
- auto a = 1, b = 2;
- auto c = 3, d = 4.0; // 该行代码会编译失败,因为c和d的初始化表达式类型不同
- }
- int main()
- {
- TestAuto();
- return 0;
- }
场景一:auto不能作为函数的参数
- #include<iostream>
- using namespace std;
- // 此处代码编译失败,auto不能作为形参类型,
- //因为编译器无法对a的实际类型进行推导
- void TestAuto(auto a)
- {
- //...
- }
- int main()
- {
- TestAuto(1);
- return 0;
- }
场景二:auto不能直接用来声明数组
- #include<iostream>
- using namespace std;
- // 此处代码编译失败,auto不能作为形参类型,
- //因为编译器无法对a的实际类型进行推导
- void TestAuto()
- {
- int a[] = { 1,2,3 };
- auto b[] = { 4,5,6 };
- }
-
- int main()
- {
- TestAuto();
- return 0;
- }
- #include<iostream>
- using namespace std;
- void TestFor_CPP()
- {
- int array[] = { 1, 2, 3, 4, 5 };
- for (auto& e : array)//这里只能用引用
- e *= 2;
-
- for (auto e : array)
- cout << e << " ";
- }
-
- void TestFor_C()
- {
- int array[] = { 1, 2, 3, 4, 5 };
- for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
- array[i] *= 2;
-
- for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
- printf("%d ", array[i]);
- }
-
- int main()
- {
- TestFor_C();
- cout << endl;
- TestFor_CPP();
- return 0;
- }
- #include<iostream>
- using namespace std;
- void TestFor(int array[])
- {
- for (auto& e : array)//范围不明确
- cout << e << endl;
- }
-
- int main()
- {
- int a[] = { 1, 2, 3, 4, 5, 6 };
- TestFor(a);
- return 0;
- }
C语言中的NULL其实是一个关键字,在stddef.h中
- #include<iostream>
- using namespace std;
- void f(int)
- {
- cout << "f(int)" << endl;
- }
-
- void f(int*)
- {
- cout << "f(int*)" << endl;
- }
-
- int main()
- {
- int* p = NULL;
- f(0);
- f(NULL);
- f(p);
-
- // C++11 nullptr 关键字 替代NULL
- f(nullptr);
- int* ptr = nullptr;
-
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。