0710学习总结(友元函数,string函数,引用)

一.友元函数
友元函数在当前类外定义,不属于当前类的函数,要加上friend.
友元函数不属于任何类的非成员函数,也可以是其他类的


代码:
#include <iostream>
using namespace std;

class address;//声明类


class student
{
private:
char *m_name;
int m_age;
float m_score;


public:
student(char *name,int age,float score);
void show(address *stu);
};


class address
{
private:
char *m_provice;
char *m_city;
char *m_qu;

public:
address(char *provice,char *city,char *qu);
friend void student::show(address *stu);//友元函数
};

student::student(char *name,int age,float score):m_name(name),m_age(age),m_score(score){}
address::address(char *provice,char *city,char *qu):m_provice(provice),m_city(city),m_qu(qu){}


void student::show(address *stu)
{
cout<<m_name<<","<<m_age<<","<<m_score<<endl;
cout<<stu->m_provice<<","<<stu->m_city<<","<<stu->m_qu<<endl;
}


int main()
{
student stu("xiaoming",20,89.1);
address add("jiangsu","nanjing","jiangnin");
stu.show(&add);


student *stu1 = new student("wamg",10,89.2);
address *add1 = new address("jiangsu","nanjing","jiangnin");
stu1->show(add1);
delete stu1;
delete add1;


return 0;
}

友元类:   
可以将整个类声明为另一个类的“朋友”,这就是友元类。
友元类中的所有成员函数都是另外一个类的友元函数。

二.string类
头文件:#include <string>
注:
1.定义但没有初始化,默认为空字符
2.与字符串不同,末尾没有‘\0’

求字符长度可以用length()
lenth返回的是字符串的真实长度。
insert函数,在一个字符串的指定位置插入另一个字符串或字符
注意:只能是string类型的参数可以使用
例子:
#include <iostream>
#include <string>
using namespace std;


int main()
{
string s1 = "123";
string s2 = "456";
string s3 = "abc";
char *s4 = "qwe123";
char s5[10] = "xxxxxx";


s1 = s1 + s2;
cout<<s1<<endl;
s1.insert(3,s3);
cout<<s1<<endl;
s1.insert(3,s4);
cout<<s4<<endl;
s1.insert(3,s5);
cout<<s1<<endl;

return 0;
}
三.erase函数,
erase函数:
erase() 函数可以删除 string 中的一个子字符串。
它的一种原型为:string& erase (size_t pos = 0, size_t len = npos);

pos 表示要删除的子字符串的起始下标,len 表示要删除子字符串的长度。
如果不指明 len 的话,那么直接删除从 pos 到字符串结束处的所有字符(此时 len = str.length - pos)。

substr函数:
substr() 函数用于从 string 字符串中提取子字符串,它的原型为:
string substr (size_t pos = 0, size_t len = npos) const;
pos 为要提取的子字符串的起始下标,len 为要提取的子字符串的长度。

find函数:
find() 函数用于在 string 字符串中查找子字符串出现的位置,它其中的两种原型为:
    size_t find (const string& str, size_t pos = 0) const;
size_t find (const char* s, size_t pos = 0) const;


#include <iostream>
#include <string>
using namespace std;


int main()
{
string s1 = "123123";
string s2 = "456";
string s3 = "abc";
string s6;
char *s4 = "qwe123";
char s5[10] = "xxxxxx";


s6 = s1.substr(3,9);
cout<<s6<<endl;

s1.erase(3,1);
cout<<s1<<endl;
s1.erase(3);
cout<<s1<<endl;

int index = s2.find("56",0);
if(index < s2.length())
{
cout<<"find"<<index<<endl;
}
else
{
cout<<"no"<<endl;
}

return 0;
}
四.引用
为什么要引用?
1.C/C++ 禁止在函数调用时直接传递数组的内容,而是强制传递数组指针;
2.对于结构体和对象没有这种限制,调用函数时既可以传递指针,也可以直接传递内容;

语法格式为:type  &name = data;


type 是被引用的数据的类型,name 是引用的名称,
data 是被引用的数据。

引用是变量的一个别名,通过这个别名或者原名都可以找到数据。

注意:
1.引用必须在定义的时候初始化。
2.引用在定义时需要添加&,在使用时不能添加&,使用时添加&表示取地址。

如果不希望通过引用来修改原始的数据,那么可以在定义时添加 const 限制,形式为:
const type &name = value;
也可以是:
type const &name = value;


例子:交换俩个数的值
#include <iostream>
using namespace std;
void swap1(int a,int b)//无法交换
{
int temp;
a = temp;
a = b;
b = temp;
}
void swap2(int *a,int *b)//传递指针,可以交换
{
int temp = *a;
*a = *b;
*b = temp;
}
void swap3(int &a,int &b)//通过引用,也可以进行交换
{
int temp = a;
a = b;
b = temp;
}


int main()
{
int a = 1;
int b = 2;
swap1(a,b);
cout<<"a:"<<a<<",b:"<<b<<endl;

swap2(&a,&b);
cout<<"a:"<<a<<",b:"<<b<<endl;

a = 1;
b = 2;
swap3(a,b);
cout<<"a:"<<a<<",b:"<<b<<endl;

return 0;
}

在将引用作为函数返回值时应该注意一个小问题,就是不能返回局部数据。


五.继承
1.继承(Inheritance)可以理解为一个类从另一个类获取成员变量和成员函数的过程。

例如类 B 继承于类 A,那么 B 就拥有 A 的成员变量和成员函数。


2.被继承的类称为父类或基类,继承的类称为子类或派生类。

3.派生类除了拥有基类的成员,还可以定义自己的新成员,以增强类的功能

4.为什么要使用继承?
(1)当你创建的新类与现有的类相似,只是多出若干成员变量或成员函数时,可以使用继承,这样不但会减少代码量,而且新类会拥有基类的所有功能。


(2)当你需要创建多个类,它们拥有很多相似的成员变量或成员函数时,也可以使用继承。可以将这些类的共同成员提取出来,定义为基类,然后从基类继承,既可以节省代码,也方便后续修改成员。
例子:
#include <iostream>
using namespace std;


class people
{
private:
char *m_name;
int m_age;


public:
void set(char *name,int age);
char *get_name();
int get_age();
};


void people::set(char *name,int age)
{
m_name = name;
m_age = age;
}
char * people::get_name()
{
return m_name;
}
int people::get_age()
{
return m_age;
}
class student:public people
{
private:
float m_score;


public:
void set_score(float score);
float get();
};


void student::set_score(float score)
{
m_score = score;
}
float student::get()
{
return m_score;
}


int main()
{
student stu;
stu.set("xiaoming",20);
cout<<stu.get_name()<<",";
cout<<stu.get_age()<<",";
stu.set_score(98.9);
cout<<stu.get()<<","<<endl;

return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值