• 13_C++_面向对象_1


    01.C++概述(了解)

    c++语言在c语言的基础上添加了面向对象编程泛型编程的支持。

    02.第一个程序helloworld(掌握)

    #define _CRT_SECURE_NO_WARNINGS
    #include
    using namespace std;//标准命名空间
    
    int main()
    {
    	//cout是标准的输出流对象,打印字符串,
    	//endl是刷新缓冲区,并换行
    	cout << "hello world!" << endl;
    	system("pause");
    	return EXIT_SUCCESS;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    03.面向对象的三大特征(了解)

    封装,继承,多态

    04.命名空间(重点)

    1. 为什么有命名空间?

    → \rightarrow 是因为解决多人合作取标识符是重命名的问题

    2. 什么是命名空间

    //命名空间
    //A是空间的名字
    namespace A{
    	int a;
    	void func()
    	{
    		// 命名空间内部可以写函数
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3. 命名空间的注意

    //注意1:命名空间只能写在全局
    //注意2:命名空间可以嵌套命名空间
    
    //命名空间可以嵌套命名空间
    namespace Maker
    {
    	int a;
    	namespace B
    	{
    		int b;
    	}
    }
    
    //注意3:命名空间是开放的,随时可以加入新成员
    //但是新成员只能在加入后使用
    namespace Maker
    {
    	int a;
    	namespace B
    	{
    		int b;
    	}
    }
    // 在此处用函数使用Maker,int c用不到
    namespace Maker
    {
    	int c;
    }
    // 在此处用函数使用Maker,int c用得到
    
    //注意4:匿名命名空间
    //类似于static int d=50;
    // 只在本.cpp文件中使用
    namespace
    {
    	int d = 50;
    }
    
    //注意5:命名空间可以取别名
    void test01()
    {
    	//			新名字    旧名字
    	namespace nameMaker = Maker;
    	cout << nameMaker::a << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    //注意6:分文件编写代码时,如果.h中有两个命名空间
    //但是里面的成员函数或成员变量同名时
    //在.cpp中实现函数时,需要加上命名空间
    
    //test.h文件
    #pragma once
    #include
    using namespace std;
    
    namespace myMaker1
    {
    	void func();
    }
    
    namespace myMaker2
    {
    	void func();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    //test.cpp文件
    #include "test.h"
    void myMaker1::func()//需要在函数名前面加入确定命名空间名字
    {
    	cout << "func" << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4. 作用域运算符双冒号

    作用域运算符双冒号::
    用来访问某个作用域里面的成员

    05.using声明和编译指令(重点)

    using声明是让命名空间中某个标识符可以直接使用

    namespace A
    {
    	int a = 10;
    	int b = 20;
    	int c = 30;
    }
    
    void test01()
    {
    	//using声明是让命名空间中某个标识符可以直接使用
    	using A::a;
    	cout << a << endl;
    	//int a = 50;
    	//注意:using声明了某个变量,在该作用域内不能定义同名的变量
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    using编译指令,让某个命名空间中的标识符都可以直接使用

    namespace A
    {
    	int a = 10;
    	int b = 20;
    	int c = 30;
    }
    void test02()
    {
    	//using编译指令,让某个命名空间中的标识符都可以直接使用
    	using namespace A;
    	cout << a << endl;
    	cout << b << endl;
    	cout << c << endl;
    
    	int a = 100;
    	//为什么不会冲突
    	//类似于命名空中的a是全局变量,这里的a的局部变量
    	//定义int a之后,namespace的a变量失效了
    	cout << "a=" << a << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    06.struct类型加强(重点)

    加强一:定义变量时不需要使用struct关键字

    加强二:结构体内可以写函数

    07.更严格的类型转换(了解)

    不能隐性的转换,必须显示的转换

    也就是说:必须要用强制转换,不能不写

    08.三目运算符(了解)

    C语言的三目运算符返回的是右值

    C++语言的三目运算符返回的是左值,是空间

    放在赋值操作符左边的是左值,放在右边的是右值

    09.C/C++的const(重点)

    1. C语言的const修饰的变量都有空间

    2. C语言的const修饰的全局变量具有外部链接属性

    在一个文件使用const全局变量,在其他文件使用extern带过来

    3. C++语言的const修饰的变量有时有空间,有时没有空间(发生常量折叠,且没有对变量进行取址操作)

    const int aa = 10;//没有内存
    
    void test01()
    {
    	//发生了常量折叠
    	cout << "aa=" << aa << endl;//在编译阶段,编译器:cout<<"aa="<<10<
    
    	//禁止编译器优化的关键字:volatile
    	//volatile const int bb = 20;//栈区
    	const int bb = 20;
    	int *p = (int*)&bb;
    	//进行了取址操作,所以有空间
    	*p = 200;
    	cout << "bb=" << bb << endl;//cout << "bb=" << 20 << endl;
    	cout << "*p=" << *p << endl;
    
    	cout << "a的地址=" << (int)&bb << endl;
    	cout << "p指向的地址" << (int)p << endl;
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    4. C++语言中const修饰的全局变量具有内部链接属性

    extern const int c = 300;
    //加上extern就变为外部链接属性
    // 在其他.c文件中使用这个const常量
    
    • 1
    • 2
    • 3

    5. C++编译器不能优化的情况

    → \rightarrow 不能优化自定义数据类型,结构体

    → \rightarrow 如果用变量给const修饰的局部变量赋值,那么编译器就不能优化

    → \rightarrow 编译器是在编译阶段来优化数据

    6. 尽量用const替代define

    → \rightarrow define没有数据类型,const修饰的变量有数据类型,可以进行数据类型检查,在使用具有重载的函数比较好用

    #define MA 128
    const short ma = 128;
    void func(short a)
    {
    	cout << "func(short a)" << endl;
    }
    
    void func(int a)
    {
    	cout << "func(int a)" << endl;
    }
    int main()
    {
    	func(ma);
    	system("pause");
    	return EXIT_SUCCESS;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    → \rightarrow const修饰的变量有作用域,define不重视作用域,不能限定常量的使用范围

    10.引用(重点难点)

    1. 引用是做什么:

    和C语言的指针一样的功能,并且使语法更加简洁

    2. 引用是什么:

    引用是给空间取别名

    3. 引用的语法

    void func(int &a)
    	//int &a=a;
    {
    	a = 200;
    }
    
    void test02()
    {
    	int a = 10;
    	func(a);
    	cout << "a=" << a << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    4. 引用的注意

    注意1:int &b = a;这里&不是取地址操作符,是引用的标记作用
    注意2:引用创建时,必须初始化。int &pRef; //error
    注意3:引用一旦初始化不能改变它的指向
    注意4:引用必须引用一块合法的内存空间

    5. 数组的引用

    int main()
    {
    	int arr[] = { 1, 2, 3, 4, 5 };
    	
    	//第一种方法(常用)
    	//1.定义数组类型
    	typedef int(MY_ARR)[5];//数组类型
    	//2.建立引用
    	MY_ARR &arref = arr;//建立引用,int &b=a;
    
    	//第二种方法(常用)
    	//直接定义引用
    	int(&arref2)[5] = arr;// int &b=a
    
    	//第三种方法
    	typedef int(&MY_ARR3)[5];//建立引用数组类型
    	MY_ARR3 arref3 = arr;
    
    	for (int i = 0; i < 5; i++)
    	{
    		cout << arref[i] << endl;
    	}
    	cout << endl;
    	for (int i = 0; i < 5; i++)
    	{
    		arref2[i] = 100 + i;
    		cout << arref2[i] << endl;
    	}
    
    	system("pause");
    	return EXIT_SUCCESS;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    6. 引用的本质(了解)

    引用的本质是编译器在内部使用常指针来实现

    //发现是引用,转换为 int* const ref = &a;
    void testFunc(int& ref){
    	ref = 100; // ref是引用,转换为*ref = 100
    }
    int main(){
    	int a = 10;
    	int& aRef = a; //自动转换为int* const aRef = &a;这也能说明引用为什么必须初始化
    	aRef = 20; //内部发现aRef是引用,自动帮我们转换为: *aRef = 20;
    	cout << "a:" << a << endl;
    	cout << "aRef:" << aRef << endl;
    	testFunc(a);
    	return EXIT_SUCCESS;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    11.指针的引用(重点难点)

    指针的引用是给指针变量这块空间取别名

    void test01()
    {
    	char* p = "翠花";
    	char* &p1 = p;
    	cout << p1 << endl;
    }
    
    //被调函数
    void func(char* &tmp)//char* &tmp=mp;
    {
    	char *p;
    	p=(char*)malloc(64);
    	memset(p, 0, 64);
    	strcpy(p, "小花");
    	tmp = p;//省了*
    }
    //主调函数
    void test02()
    {
    	char* mp = NULL;
    	func(mp);//省了&
    	cout << mp << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    12.C和C++的区别(了解)

    1. C语言的结构体不能写函数C++可以

    2. 结构体定义变量时,C++不需要加struct关键字

    3. 更加严格的类型检查

    4. const修饰的变量,C++有时没有内存,C语言的都有内存

    5. 三目运算符返回的值不一样

    6. 引用和C语言的指针功能一样

  • 相关阅读:
    数据库系列:前缀索引和索引长度的取舍
    Excel 每 N 行拼成一行
    蓝牙核心规范(V5.4)12.4-深入详解之广播编码选择
    Cookie 能跨域吗?如何设置?
    《JavaEE》HTTPS
    构建健壮的Spring MVC应用:JSON响应与异常处理
    【Linux】常用指令
    leetcode做题笔记179. 最大数
    Lodash初识
    原创!—混合灰狼层次结构的自适应麻雀搜索算法GWHASSA
  • 原文地址:https://blog.csdn.net/m0_48948682/article/details/126120127