C++学习笔记(3)


 

void tt7()
{
	//int& a = 10;//编译器报错,没有为10分配内存空间
	const int& b = 20;//为20分配了内存空间
	//相当于int temp=20;const int& b=temp;
}

不可以用字面常量初始化引用;

可以用字面常量初始化常引用;

void tt5()
{
	int a = 10;
	const int& b = a;
	cout << "b= " << b << endl;
	a = 20;
	cout << "b= " << b << endl;
}

常引用的值是可以改变的,常引用本质是常指针,指向不可变,而值可以改变;

void tt6()
{
	double	val = 3.14;
	const double& ref = val;
	double& ref2 = val;
	cout << ref << "	" << ref2 << endl;
	val = 4.14;
	cout << ref << "	" << ref2 << endl;
}

 

 

普通传参,不会改变原值;

引用传参或者指针传参,都会改变原值;

 class Teacher
{
	
public:
	int age;
	string name;
	Teacher(int age,string name)
	{
		this->age = age;
		this->name = name;
	}
	Teacher()
	{
		age = 0;
		name = "";
	}

};

 
 void showTeacher1(Teacher t)
 {
	 t.age = 30;
	 t.name = "Tom1";
	 cout << "普通传参	age= " << t.age <<"		name= "<

void tt3()
{
	int a = 10, b = 20;
	(a < b ? a : b) = 30;
	cout << "a=" << a << "	b=" << b << endl;
}
//a=30    b=20

1)C语言返回变量的值 C++语言是返回变量本身

C语言中的三目运算符返回的是变量值,不能作为左值使用

C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地

2)注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值

使用

(a < b ? 1 : b )= 30;

1)当使用时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;

2)当使用的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。

1.指针常量:int * const p=&a;常指针

指针的指向不可以改,指向的值可以改

2.常量指针:const int *p=&a;

指针的指向可以更改,指向的值不可以更改

3.同时不可修改:const int * const p=&a;

特别地,当我们想指针的指向和指向的值都不可以修改时,可以结合上面两个,写两个const

void tt1()
{
	const int a = 10;
	int* p = (int*)&a;
	cout << "a=" << a << "\n";
	*p = 5;
	cout << "a=" << a << "\n";
}
//a=10
//a = 10
void tt2()
{
	int a = 10;
	int& b = a;
	int* p = &b;
	*p = 11;
	cout << "a=" << a << "	b=" << b << endl;
	b = 12;
	cout << "a=" << a << "	b=" << b << endl;
}
//a=11    b=11
//a = 12    b = 12

STL六大组件standard template library:

  • 容器:存放数据;
  • 算法:操作数据;
  • 迭代器:算法通过迭代器操作容器数据;
  • 仿函数:为算法提供更多的策略;
  • 适配器:为算法提供更多参数的接口;
  • 空间适配器:为算法和容器动态分配、管理空间;

头文件标准格式:

头文件的作用:方便函数的调用;可以一次性包含很多函数;

不用头文件,每次调用一个函数,就要写一个函数声明,造成代码繁琐;

头文件还可以隐藏代码的实现部分,只提供函数接口,达到了保密的作用;

头文件:写函数的声明;

源文件:写函数的实现;

避免相互交替递归的包含,可能导致包含死循环,从而编译出错(包含深度1024);

  • 重复include是否会导致重复编译?重复include会导致报错“重定义”;
  • 为了避免重复编译,可以使用条件编译或者单词编译的预编译指令;
  • #ifndef #def #endif 或者#pragma once

include的本质就是拼接;

  • 头文件是可有可无的东西,源文件也是可有可无的东西;
  • 头文件可以代替源文件,源文件也可以代替头文件;二者没有本质区别;
  • 可以只有源文件而没有头文件;被调函数可以直接将实现写在源文件中;
  • 可以只有头文件而没有源文件;被调函数可以直接将实现写在头文件中;
  • 如果在包含某个文件之前,包含了这个文件的依赖文件,则该文件中可以不再包含其依赖文件;

创建头文件的四个步骤:

1 创建一个.h的头文件;

2 创建 一个.cpp的源文件;

3 头文件里面,写函数的声明;

4源文件里面写函数的实现;