3 20 黑马C 提高
函数的默认参数详解
1.增加灵活性,多占一个坑位
2.默认参数后面必须全部是默认参数
2.占位参数
void test(int a, int b, int, int c = 0)
{}
运算符重载区分前后置
3.三种参数传递方式
1.值
test(1);
值传参 -> 在传参过程中,首先将c的值复制给函数c变量,然后在函数中修改的即是函数的c变量,然后函数返回时,系统自动释放变量c。而对main函数的c没有影响。
2.指针
int c=0;
int *c=&c;
test(c);
指针传参 -> 将变量的地址直接传入函数,函数中可以对其值进行修改。
3.引用
void test(int& b)
int b=0;
test(b)
引用传参 -> 将变量的引用传入函数,效果和指针相同,同样函数中可以对其值进行修改。
。
函数重载详解
一个函数名可以有多种用途。
参数列表又叫参数签名,包括参数的类型、参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同。
函数的重载的规则:
- 函数名称必须相同。
- 参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。
- 函数的返回类型可以相同也可以不相同。
- 仅仅返回类型不同不足以成为函数的重载。
C++ 是如何做到函数重载的
编译器层面,会将函数名字改为不同的名字 然后根据参数类型的不同来寻找
这些,他们的函数入口也是不同的
C++类和对象(class和object)
1.简单的了解类
由C的结构体而来
与结构体一样,类只是一种复杂数据类型的声明,不占用内存空间。而对象是类这种数据类型的一个变量,或者说是通过类这种数据类型创建出来的一份实实在在的数据,所以占用内存空间。
类是用户自定义的类型,如果程序中要用到类,必须提前说明,或者使用已存在的类(别人写好的类、标准库中的类等)
一个简单的类
include
using namespace std;
class MyClass
{
public://属性
int a = 0;//成员
void test()//方法
{
printf("内核");
}
private:
};
int main()
{
MyClass po;//创建对象
po.a = 12;//调用
po.test();
}
2.对象指针
include
using namespace std;
class MyClass
{
public://属性
int a = 0;//成员
void test()//方法
{
printf("内核");
}
private:
};
int main()
{
MyClass po;//创建对象
po.a = 0x11;
MyClass* mu = &po;
mu->test();
MyClass* pStu = new MyClass;
pStu->a = 12;
delete(pStu);
}
一个在堆中创建 一个由指针指向
3.封装
将一个类封装 谁都可以使用 达到共同开发
4.访问权限
公共 与 私有
1.对外提供的函数或者变量,发布成public的 但不能随意改动
2.可能会变动的函数或者变量,定义成private的 这样编译器会在使用的时候做检测
3.public/private可以修饰函数也可以修饰变量.
4.只有结构体内部的函数才可以访问private的成员.
私有的访问
int* mu =(int *) &po;
printf("%x", *(mu));
由此可知 私有的访问是编译器进行了设置 不允许我们访问
5.结构体和类的区别
结构使用栈存储(Stack Allocation),而类使用堆存储(Heap Allocation)
结构是实值类型(Value Types),而类则是引用类型(Reference Types)
所有结构成员默认都是Public,而类的变量和常量数则默认位Private,不过其他类成员默认都是Public。
C++构造函数详解
1.构造函数的了解
在[C++)中,有一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户显式调用(用户也不能调用),而是在创建对象时自动执行。这种特殊的成员函数就是构造函数(Constructor)。
构造函数没有返回值,因为没有变量来接收返回值,即使有也毫无用处,这意味着:
- 不管是声明还是定义,函数名前面都不能出现返回值类型,即使是 void 也不允许;
- 函数体中不能有 return 语句。
2.重载构造函数
和普通成员函数一样,构造函数是允许重载的。一个类可以有多个重载的构造函数,创建对象时根据传递的实参来判断调用哪一个构造函数。
include
using namespace std;
class MyClass
{
public://属性
MyClass();
MyClass(int c);
void show();
private:
int c = 10;
};
MyClass::MyClass() {
c = 12;
printf("w1");
}
MyClass::MyClass(int c)
{
printf("w12222");
}
void MyClass::show()
{
printf("w1");
}
int main()
{
MyClass po;//创建对象
MyClass po1(2);//创建对象
po.show();
}
C++析造函数详解
特点
只能有一个 不能重载 不带参数 不带返回值 用于清理工作
include
using namespace std;
class MyClass
{
public://属性
~MyClass();
private:
int c = 10;
};
MyClass::~MyClass()
{
printf("释放");
}
int main()
{
MyClass* pStu = new MyClass;
delete(pStu);
}
拷贝 与析构 深入了解
拷贝构造函数
1.什么是拷贝构造
include
using namespace std;
class MyClass
{
public://属性
int c;
MyClass(int c)
{
this->c = c;
}
MyClass(const MyClass &q)
{
printf("拷贝构造");
c = q.c;
}
void show()
{
printf("%d", c);
}
private:
};
int main()
{
MyClass ct(6);
MyClass c2(ct);
c2.show();
}
2.编译器默认构造函数
include
using namespace std;
class MyClass
{
public://属性
int c;
MyClass(int c)
{
this->c = c;
}
void show()
{
printf("%d", c);
}
private:
};
int main()
{
MyClass ct(6);
MyClass c2(ct);
c2.show();
}
3.拷贝构造函数为什么引用传递
为什么引用传递
值传递传递的直接是6 引用传递传递是是地址 类型参数不符合
30: //传递的是6
31: MyClass c2(ct);
00841B19 lea eax,[ct] //获取地址
00841B1C push eax //压栈
00841B1D lea ecx,[c2] //this指针
00841B20 call MyClass::MyClass (084146Fh)
值传递
//传递的是6
31: MyClass c2(6);
001D4CF9 push 6
001D4CFB lea ecx,[c2]
001D4CFE call MyClass::MyClass (01D146Ah)
匿名类
include
using namespace std;
class MyClass
{
public://属性
int c;
MyClass(int c)
{
this->c = c;
}
~MyClass()
{
printf("小数");
}
private:
};
int main()
{
MyClass(2);
}
匿名函数生命周期在当前行
本文来自博客园,作者:逆向狗,转载请注明原文链接:https://www.cnblogs.com/Agtw/p/17236375.html