1、C++的结构体
struct Employee
{
int m_nID;
void setID(int id){m_nID=id;}
};
int main()
{
Employee Employee1;
Employee1.setID(1001);
Employee1.m_nID=1002;
}
C++结构体可以带方法的,访问权限可以是public、private、protected,并且可以从类或结构体那里继承而来
2、C++的类
class Employee
{
public:
int m_nID;
void setID(int id){m_nID=id;}
};
int main()
{
Employee Employee1;
Employee1.setID(1001);
Employee1.m_nID=1002;
cout<<"员工编号"<<Employee1.m_nID<<"\n";
return 0;
}
C++结构体成员默认访问级别、继承是public,C++类成员默认访问级别、继承是private。
#include <iostream>
using namespace std;
//指定命名空间(防止命名冲突),std是C++标准库使用的命名空间
cin>>i>>b>>c; //输入时用空白符分隔 (空格、回车或Tab键)
cout<<a+b<<endl;
3、C++输入/输出操纵符
setprecision(int p)设定有效数字的位数
cout<<hex<<i<<' '<<dec<<i<<' '<<oct<<i<<endl;
//注意''会报错;还有,如果设置了进制,这个进制会一直用下去,直到再次设定;
cout << setfill(‘$’) << setw(10) << 10 << endl;
cout << setfill(‘#’) << setw(10) << 10 << endl;
输出结果是:
$$$$$$$$10
########10
4、结构体等可直接作为类型名,内存分配与删除,引用相关
//声明类型时
enum Day{SUN, MON, TUE, WED, THU, FRI, SAT};
union U
{
char c;
float f;
double d;
};
struct Student
{
char m_strName[20];
char m_strID[12];
char m_cSex;
char m_strMajor[20];
};
//定义变量时
Day day;
U u;
Student student1;
//内存的分配和释放,new,delete
new 类型名
new 类型名(初值)
new 类型名[表达式]
int *p, *q, *r;
p = new int(5); //分配一个整数内存空间,初始值为5
q = new int; //分配一个整数内存空间,没有初始化
r = new int[10]; //分配10个整数的内存空间,并返回该空间的首地址
//delete运算符用于释放new运算符所分配的空间,以使得该空间能够被重新使用。
delete 指针变量名
delete [ ]指针变量名
s=new int[5]; delete []s;
//引用
//对变量声明一个引用,编译系统不给它单独分配存储单元,i和j都代表同一变量单元。
int i; int &j=i;
//引用在初始化后不能再被重新声明为另一个变量的引用(别名)。
//引用做函数参数
void swap(int& m,int& n) //▲▲▲▲▲
{
int temp;
temp=m; m=n; n=temp; //
}
int main()
{
int a=5,b=10;
cout<<"a="<<a<<"b="<<b<<endl;
swap(a,b);
cout<<"a="<<a<<"b="<<b<<endl;
return 0;
}
//使用引用返回函数值
//使用引用可以返回函数的值,采用这种方法可以将该函数调用放在赋值运算符的左边。
int a[ ]={1,3,5,7,9};
int& index(int i) //▲▲▲▲▲
{ return a[i];}
int main()
{
cout<<index(2)<<endl;
index(2)=25;
cout<<index(2);
return 0;
}
5、内联函数(内置函数)
程序中出现对内联函数的调用时,C++编译器直接将函数体中的代码插入到调用该函数的语句处,同时用实参来代替形参。对于要频繁调用的函数,如果其函数体中的代码很短,可以将其定义为内联函数。
inline float circle(float r)
{ return 3.1416*r*r; }
调用时area = circle(i) 直接用area=3.1416*i*i替代
以空间换时间的手段,在内联函数的函数体中,不能有复杂的控制语句,如for语句和switch语句等。
为避免代码过长,只有很短(如1~5条语句)且调用频繁的函数才考虑定义为内联函数。
6、函数重载
当调用函数名相同的重载函数时,编译器会根据实参的类型与个数来匹配这些重载函数,以决定调用哪一个重载函数。通过函数参数的类型或个数不同都能够实现函数重载。
1. List item
//过函数参数个数不同实现函数重载
#include <iostream>
using namespace std;
double add(double d1, double d2)
{ return d1 + d2;}
double add(double d1, double d2, double d3)
{ return d1 + d2 + d3;}
int main()
{ double d1, d2, d3;
d1 = 1.1;
d2 = 2.2;
d3 = 3.3;
cout<<d1<<'+'<<d2<<'='<<add(d1, d2)<<endl;
cout<<d1<<'+'<<d2<<'+'<<d3<<'='<<add(d1, d2, d3)<<endl;
return 0;
}
//不能仅仅通过函数返回值类型的不同来区分不同的重载函数,因为在进行函数调用时,这两
//个函数的调用形式是相同的
7、带有默认参数的函数
int special(int x=5,float y=5.3);
//调用
special( ); // x=5, y=5.3
special(25); // x=25, y=5.3
special(100,79.8); // x=100,y=79.8
//所有指定默认值的参数都必须出现在不指定默认值的参数的右边,否则出错
//int fun(int i, int j=5, int k);错误
int fun(int i, int k, int j=5);//正确
应用举例
```css
void init (int x=5,int y=10){
cout<<"x: "<<x<<"\t y: "<<y<<endl;
}
int main(){
init(100,80); //x=100,y=80
init(25); //相当于init(25,10),结果为x=25,y=10
init(); //相当于init(5,10),结果为x=5,y=10
return 0;
}
//在函数调用时,若某个参数省略,则其后的参数皆应省略而采用默认值
8、作业
1 编写C++风格的程序,通过键盘输入1个整数、1个字符和1个字符串到相应的变量中,然后在显示器上输出这些变量的值。
2 用户通过键盘输入整数的个数n以及每个整数的值,将这些整数存入由new运算符分配的动态数组中,对这n个整数进行排序,并输出排序结果,最后通过delete运算符完成相关内存的释放。
3 编写一个函数,将引用作为函数参数,实现两个复数变量值的交换。提示:首先定义复数结构体。
4 利用函数重载编写3个分别求短整数、整数和双精度数绝对值的函数,要求有输入和输出。
9、答案仅供参考
//1
#include<iostream>
using namespace std;
int main(){
int a;
char b;
string str;
cout<<"输入1个整数、1个字符和1个字符串"<<endl;
cin>>a>>b>>str;
cout<<a<<" "<<b<<" "<<str<<endl;
}
//2
#include<iostream>
using namespace std;
int main(){
int n;
cout<<"输入整数的个数"<<endl;
cin>>n;
cout<<"输入"<<n<<"个数"<<endl;
int *a=new int[n];
for(int i=0;i<n;i++)cin>>a[i];
//选择法排序
// int i,j,t,max;
// for(i=0;i<n-1;i++){
// max=i;
// for(j=i+1;j<n;j++)if(a[max]<a[j])max=j;
// t=a[i];a[i]=a[max];a[max]=t;
// }
//冒泡法排序
int i,j,t;
for(i=0;i<n;i++){
for(j=0;j<n-1-i;j++){
if(a[j]<a[j+1]){
t=a[j];a[j]=a[j+1];a[j+1]=t;
}
}
}
for(int i=0;i<n;i++)cout<<a[i]<<" ";
delete []a;
}
//3
#include<iostream>
using namespace std;
struct Fu{
float m;
float n;
void out(){
cout<<m<<"+i*"<<n<<endl;
}
};
void swap(Fu &a,Fu &b){
Fu t;
t=a;a=b;b=t;
}
int main(){
Fu f1,f2;
cout<<"交换前"<<endl;
f1.m=11.1;f1.n=12.22;f1.out();
f2.m=21.1;f2.n=22.22;f2.out();
swap(f1,f2);
cout<<"交换后"<<endl;
f1.out();f2.out();
}
//4
#include<iostream>
using namespace std;
void fun(short a){
if(a<0)cout<<-a<<endl;
else cout<<a<<endl;
}
void fun(int a){
if(a<0)cout<<-a<<endl;
else cout<<a<<endl;
}
void fun(double a){
if(a<0)cout<<-a<<endl;
else cout<<a<<endl;
}
int main(){
short a;int b;double c;
cin>>a>>b>>c;
fun(a);
fun(b);
fun(c);
}