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) //有参


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章