目录
指针
const修饰指针
——常量指针
//指针的地址可以改动,但是值不可以改动!!
const int *p = &a;//把a的地址赋值给指针p
const修饰常量
—— 指针常量
int * const p = &a;//指针的指向不可以改,指针的值可以改动!
结构体
定义,应用
:定义结构体的时候struct是不可以省略的,在应用的时候是可以省略的!
struct Student
{
//成员列表
string name;
int age;
int score;
};
int main(){
//法1
struct Student s1;
s1.name = "tang";
s1.age = 18;
s1.score = 90;
//法2
struct Student s2 = {“tang”,18,90};
//创建结构体数组
struct Student stdArray[3] =
{
{“tang01”,18,90},
{“tang02”,19,91}.
{“tang03”,20,92}
};
//给结构体数组赋值
stdArray[1].name = "wang";
}
结构体函数应用
//声明结构体
struct Student
{
//成员列表
string name;
int age;
int score;
};
//之所以使用地址传递就是为了内存节省空间,使用const是为了防止在使用地址传递时,误操作赋值!!
void printfstudents(const Student * s)
{
//s->age = 100;//加了const就会出现操作失败!!
cout << " 姓名:" << s->name << "age: " << s->age >> "score: " >>s->score >> endl;
}
int main()
{
Student s1 = {"tang",18,77};
//调用函数来打印结构体s1
printfstudents(&s1);
}
函数重载
满足的条件
1、同一作用域下
2、函数名相同
3、函数参数类型不同,或者个数不同,或者顺序不同
void func()
{
cout << " aaaaaaaaaaaaaaaaaa " << endl;
}
void func(int b)
{
cout << " bbbbbbbbbbbbbbb " << endl;
}
int main()
{
func();
func(40);
}
类
class Circle
{
public://公共权限
int m_r;
double calculateZC()
{
return 2 * PI * m_r;
}
};
int main()
{
Circle c1;
c1.m_r = 10;
count << "s = " << c1. calculateZC() <<endl;
}
我们通常会将变量的声明放在class中的private中,然后在public中给出其接口。因为这样我们可以控制读写权限和检测数据有效性
class Person
{
public:
//name可写
void setName(string name)
{
m_name = name;
}
//name可读
string getName()
{
return m_name;
}
//年龄仅读
int getAge()
{
age = 0;//初始化
return m_age
}
//wife仅写
void setWife(string wife)
{
m_wife = wife;
}
private:
//name可读可写
string m_name;
//仅读
int m_age;
//仅写
string m_wife;
};
int main()
{
Person p;
string per_1 = "tang";
p.getName(per_1);
count << "m_name : " << p.getName() << endl;
count << "m_age : " << p.getAge() << endl;
p.setWife("wu")
}
类的权限
1、public 公共权限——成员在类内外都 可以访问
2、protected 保护权限 ——仅在类内可以访问,且儿子可以继承
3、private 私有权限 ——仅在类内可以访问,儿子也不可以继承
class Person
{
public:
string m_name = "tang";
protected:
string car_name = "porche";
private:
int password = 456789;
private:
void func()
{
p1.m_name = "zhang";
p1.car_name = "ben";
p1.password = 987654;
}
};
int main()
{
Person p1;
p1.m_name = "wang";
//p1.car_name = " fall";//error!!
//p1.password = 123456;//error!!
}
类class和结构体struct区别
class默认权限为private私有;
struct默认权限为public公有;
构造函数和析构函数
构造函数的调用规则
1、创建一个类,C++编译器会给每个类都添加至少3个函数:
默认构造
析构函数
拷贝构造
2,如果我们写了参数构造,则不会提供默认构造,仍然会提供拷贝构造!
3,如果我们写了拷贝构造,则不会提供构造函数。
在类中调用另一个类
构造函数的顺序?
当其他类对象作为本类成员的时候,先构造类对象,再构造自身,即先部分再整体!
析构函数的顺序正好相反,先进行自身析构函数,然后再进行本类成员的析构函数!!
静态成员
1、所有的对象共享同一个函数。
2、静态成员函数只能访问静态成员变量。
3、类外不可以访问私有的静态成员函数。
4、静态成员变量必须初始化。
class Person
{
public:
//静态成员函数
static void func()
{
m_A = 100;//可以访问静态成员变量
count << " 静态成员函数 " << endl;
}
static int m_A;
};
void test01()
{
//方法一:通过对象来访问
Person p1;
p1.func();
//方法二:通过类名来访问
Person::func();
}
int Person::m_A = 10;//类外初始化
int main()
{
test01();
}
this指针的用途
1、解决名称冲突,
2、返回对象本身用 *this.
class Person
{
public:
//静态成员函数
void func(int age)
{
//this指针指向的是被调用的成员函数所属的对象!什么可以称之为对象?看下面
this->age = age;
}
int age;
};
void test01()
{
Person p1(18);
cout << "p1 age :" << p1.age <<endl;
}
int main()
{
test01();
}
对象:在类中,只有非静态变量是对象。
继承
继承的优点:
1、减少重复的代码。
语法:
class 子类 : 继承方式 父类
(子类也成为派生类;父类也成为基类)
class Basepage
{
public:
void up()
{
cout << "公共一" << endl;
}
void left()
{
cout << "公共2" << endl;
}
void right()
{
cout << "公共3" << endl;
}
};
class python : public Basepage
{
public:
void content()
{
count<< "python 特点1" << endl;
}
};
class jave : public Basepage
{
public:
void content()
{
count<< "jave 特点1" << endl;
}
};
void test01()
{
python py;
py.up();
py.left();
py.right();
py.content();
jave jv;
jv.up();
jv.left();
jv.right();
jv.content();
}
int main()
{
test01();
}
继承方式
公共继承 保护继承 私有继承
继承时父子构造函数顺序
父子中出现同名函数
:
直接调用的话是调用的子类的,加上作用域后才能调用父类的!!
解决菱形问题+ virtual
class Animal
{
public:
int m_Age;
};
class sheep : virtual public Animal {};
class tuo : virtual public Animal {};
class sheeptuo : public sheep,public tuo{};
void test01()
{
sheeptuo sp;
sp.sheep::m_Age = 10;
sp.tuo::m_Age = 18;
sp.m_Age = 20;//只有加上virtual才可以这样,否则只能用你上面的那两种!
}
int main()
{
test01();
}
多态
静态和动态
,通常是指动态多态!
静态多态:编译阶段确定函数地址;
动态多态:在运行阶段确定函数地址。
动态多态满足条件:
1、继承关系
2、子类要重写父类中的虚函数(即下面的speek函数)
(什么叫重写?函数的返回值类型、函数名和参数列表完全相同!)
class Animal
{
public:
//虚函数——动态分配地址!!!
virtual void speek()
{
cout << "animal speek!" << endl;
}
};
class Cat : public Animal
{
public:
void speek()
{
cout << "Cat speek!" << endl;
}
};
class Dog : public Animal
{
public:
void speek()
{
cout << "Dog speek!" << endl;
}
};
void dospeek(Animal &animal)
{
animal.speek();
}
void test01()
{
Cat cat;
dospeek(cat);
}