Lever_2_ C++基础 Day 8-15
Lever_2_ C++基础 Day 8-Day 15
Day_8
1- 面向过程加工的是: 一个一个函数;
面向对象加工的是:一个一个的类。
2- 类的调用
类的调用 执行过程分析 ==> 类代码不是一步一步的指向过程。
类是一个数据类型(固定大小内存块的别名); 定义一个类,是一个抽象的概念,不会立即给你分配内存。用数据类型定义变量的时候,才会分配内存。
3- 定义命名空间
//这样就可以避免多个工程(文件)使用了相同的变量名、函数名的问题。
namespace nameA
{int a=10;
}
namespace nameB
{int a=20;
}//在使用的时候,在 main中记得先声明再使用:
using namespace nameA;
using namespace nameB;cout << nameA::a << endl;cout << nameB::a << endl;//甚至可以在命名空空间里面再嵌套一个命名空间。(使用的时候只用声明最外面的)
4- 三目运算符 (a < b ? a : b )
在C语言中, 表达式的返回值 是变量的值;
在C++中, 表达式返回的是变量的本身
int a=10,b=20;(a
5- const
const 的对象的内存在符号表的位置。(不同于堆栈)
如果关键字 const 出现在星号左边,表示被指物是常量;(只能使用,不能修改)
如果关键字 const 出现在星号右边,表示指针自身是常量;
const 在两边都出现,那都不能修改;
//const 修饰的是 指针所指向的内存空间,不能被修改int operatorTeacher01(const Teacher *pT){//pT->age = 10; //报错return 0;}
//const修饰的是指针 指针变量本身不能被修改int operatorTeacher02( Teacher * const pT){pT->age = 10;//pT = NULL; //报错return 0;}
//指针和指针变量都不能被改变int operatorTeacher03( const Teacher * const pT){//pT->age = 10;//pT = NULL; //printf("age:%d", pT->age); //但是可以读return 0;}
const**在C语言中没啥用**,可以由指针间接赋值,给绕过去。
6- C++ 中 const 和 define
当const常量为全局,并且需要在其它文件中使用,会分配存储空间;
而 define 只起一个替换作用。
7- 引用 Type &name = var
引用可以看作一个已定义变量的别名,是C++的独特语法。
int a=20;
int &b = a;
相当于a b 现在共用一个地址,引用过后一变都变啊!
引用作为其它变量的别名而存在,因此在一些场合可以代替指针。相对于指针来说具有更好的可读性和实用性。
引用在C++中的内部实现是一个常量指针
Day_9
1-引用
指针的引用:
T* &p;
类比: int * &a; //只不过这里是结构体 T*
常引用:让变量拥有: “只读”属性
-
用变量 初始化 常引用
int x=20; const int &y = x; //常引用 让变量 引用只读属性 不能通过y去修改x了 -
用字面量 初始化 常量引用
const int a = 40; //c++编译器把a放在 符号表 中 错:int &m = 41; //报错!常量没有内存地址//引用 就是给内存取多个门牌号 (多个别名) 对:const int &m = 43; //正确! c++编译器 会 分配内存空间 等同于 const int m = 43;
2-inline 内联函数
为了解决一些频繁调用的小函数大量占用栈空间(栈内存)的问题,因此引入了内联函数。
用法:在函数前面加上关键字 inline 即可
注意:
- inline必须和函数体的实现写在一块,声明的时候可以不写。
- 编译器可能拒绝inline的请求,而变成普通函数。
- inline函数编译限制:不能存在任何形式的循环语句(否则变成普通函数)
3-函数默认参数
- 在函数形参不写的时候,就使用默认参数。
void myPrint(int x = 3)
{cout<<"x: "<
- 函数形参中如果有多个默认参数,和非默认参数,那默认参数应该写在右边:
void myPrint2( int m, int n, int x = 3, int y = 4)
错:void myPrint2( int m, int n, int x = 3, int y )
{cout<<"x"<
4-函数占位参数
函数调用时,必须写上所有参数
void func1(int a, int b, int)
{cout<<"a"<
5-默认参数 & 占位参数
void func2(int a, int b, int =0)
{cout<<"a= "<
6-函数重载
用同一个函数名定义不同的函数,当函数名和不同的参数搭配时函数的含义不同。
函数重载至少满足下面的一个条件:(返回值不是重载的标准)
- 参数个数不同
- 参数类型不同
- 参数顺序不同
7-函数指针 & 指针函数
指针函数本质是一个函数,其返回值为指针。
函数指针本质是一个指针,其指向一个函数。
-
指针函数:
其本质是一个函数,而该函数的返回值是一个指针。
int *fun(int x,int y); 其返回值是一个 int 类型的指针,是一个地址。 -
函数指针:
其本质是一个指针变量,该指针指向这个函数。
声明函数指针: int (*fun)(int x,int y);函数指针是需要把一个函数的地址赋值给它,有两种写法:
p = &Function; p = Function; 取地址运算符&不是必需的,因为一个函数标识符就表示了它的地址。如果是函数调用,还必须包含一个圆括号括起来的参数表。
x = (*fun)(); //推荐这种 x = fun();
8-类的封装 和 访问控制
封装:1-是对属性和方法进行封装;
2-对属性和方法进行访问控制(public/private/protected)
(把属性和方法进行封装 对属性和方法进行访问控制)
类比结构体有用,因为它不仅可以调用成员属性,还可以调用成员函数(方法)。
-
函数中调用类的方法:
class MyCircle{...}void printCircle01(MyCircle *pC) //指针 {cout<< "r" << pC->getR() << endl;cout<< "s" << pC->getS() << endl; }void printCircle02(MyCircle &myc) //引用 {cout<
类的访问控制关键字:
把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
public: 修饰的成员变量和函数 可以在类的内部和类的外部访问;
private: 修饰的成员变量和函数 只能在类的内部被访问,不能在类的外部访问;
protected: 修饰的成员变量和函数 只能在类的内部被访问,不能在类的外部访问, 用在继承里面。
public 相当于名字,可以任意被访问;
private 相当于密码,不能被任意访问。
Day_10
1-构造函数
构造函数我理解为可以快速初始化成员属性。在定义类时, 只要你写了构造函数,则必须要用
定义:
1)C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数;
2)构造函数在定义时可以没有参数,也可以有参数;
3)构造函数没有任何返回类型的声明。
1.1-无参数的构造函数调用
啥也不写
class Test
{
public:Test() //无参数 构造函数{cout<<"我是构造函数 被执行了"<
1.2-有参数的构造函数有3种调用方法:
class Test
{
public:Test2(int a, int b) //有参
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
