int (*pf)(int , char);
//pf为一个函数指针,它所指向的函数的返回值是int,2个参数一个是int类型一个是char类型
#include <stdio.h>
void PrintMin(int a, int b)
{
if(a < b)
printf("%d",a);
else
printf("%d",b);
}
int main()
{
void(* pf)(int, int);
int x = 4, y = 5;
pf = PrintMin;
pf(x,y);
return 0;
}
//pf指针指向PrintMin
void qsort(void *base, int nelem, unsigned int width, int(* pfCompare)(const void*,const void*));
//base:待排序数组的起始地址
//nelem:待排序数组的元素个数
//width:待排序数组的每个元素的大小(以字节为单位)
//pfCompare:比较函数的地址
//pfCompare:函数指针,它指向一个“比较函数”,该比较函数的形式如下
//int 函数名 (const void * elem1,const void * elem2);
//比较函数是程序员自己编写的
#include <stdio.h>
#include <stdlib.h>
int MyCompare(const void * elem1,const void * elem2)
{
unsigned int * p1, * p2;
p1 = (unsigned int *) elem1; //"*elem1" 非法,编译器不知道void指针指向的元素有多少个字节
p2 = (unsigned int *) elem2; //"*elem2" 同上
return (*p1 % 10) - (*p2 % 10);
}
#define NUM 5
int main()
{
unsigned int an[NUM] = (8,123,11,10,4);
qsort(an,NUM,sizeof(unsigned int),MyCompare);
for(int i=0;i<NUM;i++)
printf("%d",an[i]);
return 0;
}
int main(int argc, char * argv[])
{
...
}
将参与运算的两数,各对应的二进制位进行与操作,只有对应的两个二进制位均为1时,结果对应的二进制位才为1,否则为0
通常用来将某变量中的某些位清0切同时保留其他位不变,也可用来获取某变量中的某一位
int a = 5, b = 7;
a = a ^ b;
b = b ^ a;
a = a ^ b;
下面的写法定义了一个引用,并将其初始化为引用某个变量
类型名 & 引用名 = 某变量名
int n = 4;
int & r = n; //r引用了n,r的类型是int &
某个变量的引用,等价于这个变量,相当于该变量的一个别名
定义引用时一定要将其初始化成引用某个变量
初始化后,他就一直引用该变量,不会再引用别的变量了
引用只能引用变量,不能引用常量和表达式
void swap(int a, int b)
{
int tmp;
tmp = a; a = b; b = tmp;
}
int n1,n2;
swap(n1,n2); //n1n2的值不会被交换,形参的改变无法影响实参
void swap(int *a,int *b)
{
int tmp;
tmp = *a; *a = *b; *b = tmp;
}
int n1,n2;
swap(&n1,&n2); //n1n2的值被交换,但是多了很多符号,比较麻烦
void swap(int &a, int &b)
{
int tmp;
tmp = a; a = b; b = tmp;
}
int n1,n2;
swap(n1,n2); //n1n2的值被交换,由于a和b是n1和n2的引用,因而可以直接修改
int n = 4;
int & SetValue() {return n;}
int main()
{
SetValue() = 40; //函数的返回值是引用,就可以把函数写在等号左边,可以直接赋值
cout<<n;//输出:40
return 0;
}
int n;
const int & r = n;
//r的类型是const int &
const int MAX_VAL = 23;
const double Pi = 3.14;
int n,m;
const int *p = &n;
*p = 5; //编译错误
n = 4; //正确
p = &m; //正确,可以改变常量指针指向的对象
const int * p1; int * p2;
p1 = p2;//正确
p2 = p1;//错误
p2 = (int *)p1;//正确,通过强制类型转换
void MyPrintf(const char *p)
{
strcpy(p,"this");//编译错误
printf("%s",p);//正确
}
int n;
const int & r = n;
r = 5;//编译错误
n = 4;//正确
int *pn;
pn = new int;
*pn = 5;
int *pn;
int i = 5;
pn = new int[i * 20];
pn[0] = 20;
pn[100] = 30;//虽然编译正确,但运行时会出现数组越界
int *p = new int;
*p = 5;
delete p;
delete p; //导致异常,一片空间不能够被delete多次
int *p = new int[20];
p[0] = 1;
delete [] p;
函数调用存在时间开销。如果函数本身只有几条语句且执行非常快,而且函数被反复执行多次,相比其运行时间,调用函数所产生的时间开销就会很大。
为了减少该开销,引入了内联函数机制。编译器处理对内联函数的调用语句时,是将整个函数的代码插入到调用语句处,而不会产生调用函数的语句。
在函数定义前面加“inline”关键字,即可定义内联函数
缺点是可执行程序的体积会增大
一个或多个函数,名字相同,然而参数个数或参数类型不相同,这叫做函数重载
以下三个函数是重载关系:
int Max(double f1,double f2){ }
int Max(int n1,int n2){ }
int Max(int n1,int n2,int n3){ }
函数重载简化函数命名
编译器根据调用语句中的实参的个数和类型判断应该调用哪个函数
void func(int x1, int x2 = 2, int x3 = 3){ }
func(10);//等效于func(10,2,3)
func(10,8);//等效于func(10,8,3)
func(10,,8);//编译错误,只能最右边的连续若干个参数缺省
第一个面向对象语言:Simula
第二个面向对象语言:Smalltalk
1983年 C++
1995年 JAVA
2003年 C#
class CRectangle{
public:
int w,h;
void Init(int w_, int h_)
{
w = w_; h = h_;
}
int Area()
{
return w*h;
}
int Perimeter()
{
return 2*(w+h);
}
};
int main()
{
int w,h;
CRectangle r; //r是一个对象
cin>>w>>h;
r.Init(w,h);
cout<<r.Area()<<endl<<r.Perimeter();
return 0;
}
对象的内存分配
对象间的运算
访问类的成员变量和成员函数
类的成员函数的另一种写法
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<string>
#include<string.h>
//虽然我本地编译用最上面那个头文件就过了,但上传上去好像必须要加上后面这四个才能通过……行吧
using namespace std;
class student{
private:
char name[10];
int age;
char number[10];
unsigned int gradeAverage;
public:
void gradeCalculate(unsigned int a,unsigned int b,unsigned int c,unsigned int d)
{
gradeAverage = (a+b+c+d)/4;
}
student(const char* name_, int age_, const char* number_)
{
strcpy(name,name_);
age = age_;
strcpy(number,number_);
}
void getAll()
{
cout << name <<‘,‘ << age << ‘,‘ << number << ‘,‘ << gradeAverage << endl;
}
};
int main()
{
char name[10] = {‘\0‘},number[10] = {‘\0‘};
int age;
unsigned int grade1,grade2,grade3,grade4;
//此处的cin.get()用于把逗号吞掉
cin.getline(name,10,‘,‘);
cin >> age;
cin.get();
cin.getline(number,10,‘,‘);
cin >> grade1;
cin.get();
cin>> grade2;
cin.get();
cin >> grade3;
cin.get();
cin >> grade4;
student* a = new student(name,age,number);
a->gradeCalculate(grade1,grade2,grade3,grade4);
a->getAll();
delete(a);
return 0;
}
Coursera课程笔记----C++程序设计----Week1&2
原文:https://www.cnblogs.com/maimai-d/p/12879933.html