bool flag = true;//只有真或假,0代表假,非0都是真 voidtest05(){ cout << sizeof(bool) << endl;
flag = 100; //bool类型非0的值转为1,0就转为0 cout << flag << endl; }
6.三目运算符
在C语言中三目运算符返回的是值 C++中三目运算符返回值是变量
1 2 3 4 5 6 7 8
voidtest06(){ int a = 10; int b = 20; cout<<"ret="<<( a < b ? a : b)<<endl; (a < b ? a : b )= 100;//返回b=100; //C语言返回的是值,C++中返回的是变量 cout << "a=" << a << " b=" << b << endl; }
voidtest01(){ int a = 10; int& b = a; b = 20; cout << "a=" << a << " b=" << b << endl; }
2.必须初始化
引用必须初始化,一旦初始化后就不能修改了
1 2 3 4 5 6 7 8 9
voidtest02(){ //int &a;//会报错,引用必须初始化! int a = 10; int& b = a;//引用初始化后不可以修改! int c = 20; //&b = c;//不叫初始化,叫赋值,只能初始化,不能这样赋值 b = c;//赋值 cout << "a=" << a << " b=" << b << " c=" << c << endl; }
3.对数组建立
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
voidtest03(){ int arr[10]; for (int i = 0; i < 10; i++) { arr[i] = i; } //给数组起别名 //方法1 int(&parr)[10] = arr; for (int i = 0; i < 10; i++) cout << parr[i] << endl; cout << endl; //方法2 typedef int(ARRAYREF)[10];//一个具有十个元素的int类型的数组 ARRAYREF& parr2 = arr; for (int i = 0; i < 10; i++) cout << parr2[i] << endl; }
参数的传递方式
1.值传递
这种传递有作用域限制,从输出就可以看出,修改的并不是原来的值,而是新的两个值
1 2 3 4 5 6 7 8 9 10 11 12
voidmyswap(int a,int b){ int tmp=a; a = b; b = tmp; cout << "myswap::a==" << a << " myswap::b=" << b << endl; } voidtest01(){ int a = 10; int b = 20; myswap(a, b);//值传递方式 cout << "a=" << a << " b=" << b << endl; }
cout << "myswap::a==" << *a << " myswap::b=" << *b << endl; } voidtest02(){ int a = 10; int b = 20; myswap2(&a, &b);//值传递方式 cout << "a=" << a << " b=" << b << endl; }
3.引用传递
引用就是起别名,我们用引用相当于给原值取个别名,然后修改的别名其实也就是原值
1 2 3 4 5 6 7 8 9 10 11 12 13
voidmyswap3(int &a ,int&b){//&a=a,用别名的方式 int tmp = a; a = b; b = tmp; cout << "myswap::a==" << a << " myswap::b=" << b << endl;
} voidtest03(){ int a = 10; int b = 20; myswap3(a,b);//值传递方式 cout << "a=" << a << " b=" << b << endl; }
4.注意事项
引用必须引一个合法的内存空间(常量不是合法空间,但是后面会有常量引用)
不要返回一个局部变量的引用(局部变量加上static可以解决这个问题)
1 2 3 4 5 6 7 8 9 10 11 12
int& dowork(){ int a = 10; return a; } voidtest04(){ //int& a = 10;//必须合法内存空间! int &res=dowork();//vs处理方式不同 cout << res << endl;//第一次是编译器做了优化,后续就是乱码了 cout << res << endl; cout << res << endl; cout << res << endl; }
1 2 3 4 5 6 7 8 9 10 11 12
int& dowork2(){ staticint a = 10; return a; } voidtest05(){ int& res = dowork2();//如果函数的返回值为引用,那么这个函数的调用可以做为左值 dowork2() = 1000;//a=1000; cout << res << endl;//第一次是编译器做了优化,后续就是乱码了 cout << res << endl; cout << res << endl; cout << res << endl; }
//定义一个加法 #define Myadd(x,y) ((x)+(y)) voidtest01(){ int ret = Myadd(10,20)*20; //预期600 10+20*20 所以要加小括号 cout << "ret=" << ret << endl; }
上面的加法看似没有问题,但如果我们的宏是三目,传入值是++a,输出值就会有问题了
1 2 3 4 5 6 7
#define mycompare(a,b) ((a)<(b))?(a):(b) voidtest02(){ int a = 10; int b = 20; int ret=mycompare(++a, b); //((++a)<(b))?(++a):(b) 预期11,实际出来12 cout << "ret=" << ret << endl; }
但是如果用普通函数就没有问题
1 2 3 4
voidmycp(int a,int b){ int ret = a < b ? a : b; cout << "ret:::" << ret << endl; }
把这个普通函数变成内联函数
1 2 3 4
inlinevoidmycp(int a,int b){ int ret = a < b ? a : b; cout << "ret:::" << ret << endl; }
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<cstring> usingnamespacestd; classcube { public: voidgetabc(int geta,int getb,int getc){ a = geta; b = getb; c = getc; } voidgets(){ cout << "这个立方体面积为:" << (2 * a * b + 2 * a * c + 2 * b * c) << endl; //return (2 * a * b + 2 * a * c + 2 * b * c); } voidgetv(){ cout << "这个立方体体积为:" << (a * b * c) << endl;; } intgeta1()const{ return a; }
//通过成员函数来判断是否相等 boolcpr(cube &c2){ if(a==c2.a) returntrue; else { returnfalse; } } private: int a; int b; int c; }; boolisSama(const cube &c1,cube &c2){//引用没有开销!所以尽量用引用 //虽然因为不修改,加const更严谨,但是这里要调用成员方法,而成员方法可以修改private值,所以这里不能用const,(但如果成员属性改成public就可以加上const之后去调用属性了) //但是如果成员函数也加上const来表明不可修改,这里就可以加上const了,比如这个c1。 if (c1.geta1() == c2.geta1()) { returntrue; } else { returnfalse; } } voidtest01(){ cube cube1; int x, y, z; cin >> x >> y >> z; cube1.getabc(x, y, z); cube1.gets(); cube1.getv();