1.地址传递与指针传递
student
{
string name;
int age;
int score;
}
值传递
void printstudent(student s)
{
cout <<"姓名"< } 地址传递 void printstudent1(student *p) { cout <<"姓名"< } int main() { student s; s.name = ''张三"; s.age = 20; s.score = 85; printstudent(s); printstudent1(&s); } 将函数的形参设置成指针,可以减少内存空间,而且不会复制新的副本。 student Arry[5]结构题数组。 2.C++中存储空间的分配(内存四区) 内存四区存在的意义:方便不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程。 **程序运行前的区域 2.1 代码区 存放CPU机器指令 代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份就可。 代码区是只读的,使其只读的原因是防止程序意外的修改指令。 2.2全局区 全局变量和静态变量存放在此(包括常量区、字符串常量、还有其他常量)。 该区域在程序结束以后由操作系统释放。 **程序运行后的 //全局变量 int c; int d;//写在函数体外部的变量称为全局变量 //全局常量 const e; int main(){ //局部变量 int a;//写在函数体里的都是局部变量 intb; //静态变量 static int s_a = 10; //字符串常量 '"hello word" 双引号框起来就是字符串常量。 //const常量 const int c_a = 10;//全局常量 } 代码的地址不在一个段里面。 ****程序运行后 2.3栈区 由编译器自动分配释放,存放函数的参数值,局部变量等 注意:不要放回局部变量的地址,栈区开辟的数据由编译器自动释放。 2.4堆区 由程序员分配释放,若程序员不释放,程序结束时由操作系统回收 c++中主要利用new在堆区开辟内存 void* func() { //利用new关键字 可以将数据开辟到堆区 //如果不调用new,就在栈区,放回的地址就不可行 //指针的本质也是局部变量,放在栈上,指针保存的数据是放在堆区。 int *p = new int(10) return p; } //看下图理解 3、new操作符 c++中利用new操作符在堆区开辟数据,由程序员分配,由程序员释放(delete) int * func() { int * p = new int(10); return p; } void test01() { int * p = func(); cout << *p < cout << *p < delet p; cout << *p < } ****在堆区中开辟数组 void test02() { int * arr = new int[10]; for (int i =0 ; i<10 ; i++) { arr[i] = i+100; cout<< arr[i]< } delete[] arr; } 4.引用 引用:起别名。 int a =10; int &b = a; 4.1 引用必须要初始化 一旦初始化后,就不可以更改了 4.2引用做函数参数时。 作用:函数传参时,可以利用引用的技术让形参修饰实参。 优点:可以简化指针修改实参 //交换函数 1、值传递 void mySwap01(int a , int b) { int temp = a; a= b ; b=a; } 2、地址传递//利用形参修饰实参 void mySwap02(int *a , int *b) { int temp = *a; *a= *b ; *b=*a; } 3、引用传递//形参修饰实参 void mySwap03(int &a , int &b) { int temp = a; a= b ; b=a; } int main() { int a = 10 ; int b = 20; mySwap01(a,b); mySwap02(&a,&b); mySwap03(a,b); } 4.3引用做函数的返回值 引用是可以作为函数的返回值的存在 1、函数不要返回局部变量的引用 2、函数的调用可以作为左值 int& test02() { static int a = 10; return a; } int main() { int &ref2 = test02(); cout << "ref2"< test02() = 1000;如果函数的返回值是引用,这个函数调用可以作为左值 cout <<"ref2"< } 4.4引用的本质 本质:引用的本质是在c++内部实现的一个指针常量。 结论:c++推荐引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了 4.5常量引用 作用:常量引用主要用来修饰形参,防止误操作。 在函数形参列表中,可以加const修饰形参,防止形参改变实参。 int main() { int a=10; int &ref = 10;//不合法, //加上const之后 编译器将代码修改 int temp = 10; int &ref = temp; const int & ref = 10;//合法 } void showValue(const int &a) { a =1000;//加入const,无法更改 cout << "val"< } int main(){ int a = 100; showValue(a); } 5.函数的提高 5.1函数默认参数 int func (int a,int b =20 ,intc = 30)//如果我们传入数据,就用自己的数据,如果没有,就用默认值 { return a+b+c; } int main() { cout << func(10)< system("pause") } 注意事项 1.如果某个位置已经有了默认参数,那么从这个位置以后,从左往右都必须有。 2.如果函数声明有了默认参数,函数实现就不能有默认参数。 int fun2( int a =10,int b=10); int func2(int a = 20, int b =20) { return ... } 5.2函数重载, 作用:函数名可以相同,提高复用性。 函数重载的条件: #在同一作用域下 #函数名称相同 #函数参数类型不同,或者个数不同或者顺序不同 5.3函数重载注意事项 引用作为重载条件 函数重载碰到函数默认参数(写函数重载最好不要加默认参数) 6.类和对象 C++面向对象的三大特征为:封装、继承、多态 C++认为万事万物皆为对象,对象上有其属性和行为 称为类 6.1封装 6.1.1封装意义 封装的意义 #将属性和行为作为一个整体,表现生活中的事物 #将属性和行为加以权限控制 在设计类的时候,属性和行为写在一起,表现事物 //设计一个圆类,求圆的周长 //圆求周长的公式: //class 代表设计一个类,类后面紧跟着的就是类的名称 class Cricle { //访问权限 public; //属性 int m_r; //行为 double calulateZC() { return 2 *PI *m_r; } } int main(){ //通过圆类,创建具体的圆(对象) Circle c1; //给圆对象的属性进行赋值 c1.m_r = 10; cout << "圆的周长为"<< c1.calulateZC()< 封装意义二: 类在设计时,可以把属性和行为放在不同的权限下,加以控制访问权限有三种: 1.public 公共权限 //成员类内可以访问 类外可以访问, 2.protected 保护权限//成员 类内可以访问 类外不可以访问 儿子可以访问父亲中的保护内容。 3.private 私有权限//成员 类内可以访问 类外不可以访问 儿子不可访问 class Person { public: string m_Name; protected: string m_car; private: int m_Password; public: void func() { m_name = "张三'; m_Car = "拖拉机"; m_Password = "123456"; } } int main(){ Person p1;//类外不可访问 p1.m_Name = "李四";//类外可以访问 p1.m_Car = ''奔驰'';//类外不可访问} 6.1.2struc和class区别(其实差不多) 在C++中struct和class唯一的区别就在于默认的访问权限不同 区别: #struct 默认权限为公共 #class默认权限为私有 6.1.3成员属性设置为私有 优点1 :将所有成员属性设置为私有,可以自己控制读写权限。 优点2:对于写权限,我们可以检测数据的有效性。 //设计人类 class Person { public: 设置姓名 void setName(string name) { m_Name = name; } 读取姓名 string getName() { return m_Name; } int getAge() { } private: string m_Name; int m_Age; string m_Lover; } int main() { // Person m; // m.m_Name = ://不行,不可访问私有属性 }



