c++指针、结构体、函数重载、类、继承和多态的学习

指针

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 = 456789private:
	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);
	
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值