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= "<<t.name<< endl;
}
void showTeacher2(Teacher& t)
{
t.age = 40;
t.name = "Tom2";
cout << "引用传参 age= " << t.age << " name= " << t.name << endl;
}
void showTeacher3(Teacher* t)
{
t->age = 50;
t->name = "Tom3";
cout << "指针传参 age= " << t->age << " name= " << t->name << endl;
}
void tt4()
{
Teacher t = Teacher(20,"Jack");
showTeacher1(t);
cout << "初始数值 age= " << t.age << " name= " << t.name << endl;
showTeacher2(t);
cout << "初始数值 age= " << t.age << " name= " << t.name << endl;
showTeacher3(&t);
cout << "初始数值 age= " << t.age << " name= " << t.name << endl;
}
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)当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;
2)当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用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源文件里面写函数的实现;