【C/C++学院】(4)c++开篇/类和对象/命名空间/类型增强/三目运算符/const专题/引用专题/函数增强...
1.类和对象
成员函数,成员变量,抽象封装的能力。
求圆的面积;
#include <iostream>
using namespace std;
class circle{
private:
double m_r;//成员变量
public:
void setR(double r)//成员函数
{
m_r = r;
}
double getR()
{
return m_r;
}
double getS()
{
return 3.14*m_r*m_r;
}
};
void main()
{
circle c1;
c1.setR(4);
cout << "r:" << c1.getR() << "s:" << c1.getS() << endl;
c1.setR(5);
cout << "r:" << c1.getR() << "s:" << c1.getS() << endl;
system("pause");
}
2.命令空间
命名空间;c++对c的扩展。解决标识符冲突。
std::out :: 域作用符。
#include <iostream>
namespace NameSpaceA{
int a = 0;
}
namespace NameSpaceB{
int a = 1;
namespace NameSpaceC{
struct Teacher{
char name[10];
int age;
};
}
}
void main()
{
using namespace NameSpaceA;
printf("NameSpaceA:a=%d\n", a);
printf("NameSpaceB:a=%d\n", NameSpaceB::a);
using NameSpaceB::NameSpaceC::Teacher;
Teacher t1 = { "aaa", 3 };
printf("t1.name = %s\n", t1.name);
printf("t1.age = %d\n", t1.age);
system("pause");
}
3.语法增强
3.1register关键字增强
int main()
{
register int a = 0;
printf("&a = %x\n", &a);
system("pause");
return 0;
}
//register关键字 请求编译器让变量a直接放在寄存器里面,速度快
//在c语言中 register修饰的变量 不能取地址,但是在c++里面做了内容
register关键字的变化
register关键字请求“编译器”将局部变量存储于寄存器中
C语言中无法取得register变量地址
在C++中依然支持register关键字
C++编译器有自己的优化方式,不使用register也可能做优化
C++中可以取得register变量的地址
3.2struct类型增强
struct类型的加强: C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型 C++中的struct是一个新类型的定义声明 |
struct Student { char name[100]; int age; };
int main(int argc, char *argv[]) { Student s1 = {"wang", 1};//struct Student s1={}; Student s2 = {"wang2", 2}; return 0; } |
4.三目运算符
#include <iostream>
using namespace std;
//在c++里面的三目运算符 返回是一个变量
//让表达式做左值
//1 左值 能被放在 = 做值 称为左值
//2 当左值的条件, 这段内存空间可以被你写
int main()
{
int a = 10;
int b = 20;
int c = 31;
//返回一个最小数 并且给最小数赋值成30
//三目运算符是一个表达式 ,表达式不可能做左值
//让表达式做左值
(a < b ? a : b) = 30;//相当于c中的*((a < b ? &a : &b)) = 30;
//在c中编译不过,报错
printf("a = %d, b = %d\n", a, b);
system("pause");
return 0;
}
5.const专题
const 定义的变量, 在c++的编译器中, 做了一个符号表, key <--->value | a<-->10;
修改的时候, 只是修改了重新分配的空间, 对原来的const数据没有造成修改。
而在c中,却可以将const常量进行修改。
6.引用专题
引用在c++内部是一个常量指针。
type &name <---> type * const name;
引用的本质是c++编译器帮我们做了一个取地址的操作。
#include <iostream>
using namespace std;
void swap(int &a, int &b)
{
int c = 0;
c = a;
a = b;
b = c;
}
void swap2(int *a, int *b)
{
int c = 0;
c = *a;
*a = *b;
*b = c;
}
//引用和左值进行绑定的时候
void main()
{
int a1 = 10; int b1 = 20;
swap(a1, b1);
printf("a1:%d, b1:%d", a1, b1);
system("pause");
}
7.函数增强
7.1内联函数
内联函数的函数体需要和实现写在一起,不能单独声明。
代替带参数的宏,避免宏的副作用。
#include "iostream"
using namespace std;
#define MYFUNC(a, b) ((a) < (b) ? (a) : (b))
//inline请求关键字, 内联编译
//内联函数的函数体,需要和实现写在一块
inline int myfunc(int a, int b)
{
return a < b ? a : b;
}
int main()
{
int a = 1;
int b = 3;
//int c = myfunc(++a, b);
int c = MYFUNC(++a, b);//===> ((++a) < (b) ? (++a) : (b));
printf("a = %d\n", a); //3
printf("b = %d\n", b);//3
printf("c = %d\n", c); //3
system("pause");
return 0;
}
7.2函数重载
函数重载与函数指针的结合;可以添加断电,选择逐语句执行,观察运行效果。
#include "iostream"
using namespace std;
int func(int x) // int(int a)
{
return x;
}
int func(int a, int b)
{
return a + b;
}
int func(const char* s)
{
return strlen(s);
}
//定义了一个 指针 类型 (指向函数的指针类型)
typedef int(*PFUNC)(int a); // int(int a)
void main()
{
PFUNC p = func;
int c = p(1);
printf("c = %d\n", c);
system("pause");
}