一、函数指针
func.h:
#ifndef FUNC_H_
#define FUNC_H_
#include <string>
#include <iostream>
int compare(const std::string& s1, const std::string& s2); // 普通函数
typedef int (*COMP)(const std::string& s1, const std::string& s2);
void myfun(std::string *s1, std::string *s2, COMP comp=compare); // 参数中含有函数指针,可以有默认值
#endif
func.cpp:
#include "func.h"
#include <string>
#include <iostream>
int compare(const std::string& s1, const std::string& s2) {
return s1.compare(s2);
}
void myfun(std::string *s1, std::string *s2, COMP comp) {
std::cout << "myfun:comp('" << *s1 << "','" << *s2 << "'): " << comp(*s1, *s2) << std::endl;
}
main.cpp:
#include <iostream>
#include <vector>
#include "func.h"
using namespace std;
int main(int argc, char* argv[]) {
cout << "Hello World!!!" << endl;
cout << "compare('aaa','bbb'): " << compare("aaa", "bbb") << endl; // 普通调用
int (*fp)(const string&, const string&);
fp = compare;
cout << "function pointer: " << fp("aaa", "bbb") << endl; // 通过函数指针调用
fp = &compare; // 和上面等价
cout << "function pointer: " << fp("aaa", "bbb") << endl;
string s1("aaa");
string s2("bbb");
myfun(&s1, &s2, fp); // 把函数指针作为参数传到一个函数中去
return 0;
}
运行结果:
Hello World!!!
compare('aaa','bbb'): -1
function pointer: -1
function pointer: -1
myfun:comp('aaa','bbb'): -1
二、static关键字
1. 面向过程
* static全局变量:只能在本文件中访问。和普通全局变量的区别就是作用域被限制在一个文件中
* static局部变量:函数退出时仍保持其值不释放。普通的局部变量在函数退出时会被释放
* static函数:只能在本文件中访问。普通函数通过extern的方式(一般定义在头文件中)可被用于其它文件中。
2. 面向过程
* static属性或方法:属于类而非某个对象。不能调用非static成员,当非static成员可以调用它。这个和JAVA没有区别
三、namespace
作用就是在全局命名空间(::)中继续划分子空间。子空间的定义会覆盖父空间的定义。和JS中的域差不多。
1.定义
namespace MySpace {
// 各种定义
namespace InnerSpace1{ // 可以嵌套
// 各种定义,会覆盖外层同名的定义
}
}
2. 使用
* MySpace::xxx // 直接使用域前缀的方式去访问该命名空间下的成员
* using MS=MySpace; // 别名
MS::xxx // 使用域前缀的方式访问。类似于JAVA的全类名java.util.List
* using MySpace::xxx; // 使xxx可见。类似于JAVA的import java.util.List;
xxx.fun(); // 类似于JAVA的ist.add();
* using MySpace; // 使该空间下的所有成员可见。类似于JAVA的import java.util.*;
xxx.fun();
四、函数重载
* 函数名相同,参数的个数、类型、顺序不同
* 不考虑返回类型,不考虑参数名称
* 不考虑形参的const,volatile修饰符 (指针和引用类型的除外)
* 只考虑typedef所代表的底层类型
* 不考虑形参是否缺省
五、函数的几种返回类型
class Test {
public :
Test(){val=0;}
Test(int v) {
val = v;
}
~Test(){val=-1;}
inline int get(){return val;}
inline void set(int v){val = v;}
private :
int val;
};
Test getTest1() {
// Test t(100);
// return t; // 会调用拷贝构造,然后析构t
// Test t(100);
// Test &rt = t;
// return rt; // 同上
Test *t = new Test(100);
return *t; // 会照成内存泄露。函数结束后,t变量消失,但其所指向的对象没有释放(delete t)
}
Test& getTest2() {
// Test t(100);
// return t; // 函数结束后t被析构,返回值指向一个无效的内存区域
// Test t(100);
// Test& rt = t;
// return rt; // 同上
Test *t = new Test(100);
return *t; // 函数结束后t消失,而返回的引用指向了被new出来的内存。但是因为返回的不是一个指针,所以无法通过delete去释放这块内存,造成内存泄露
}
Test* getTest3() {
// Test t(100);
// return &t; // 函数结束后t被析构,返回的指针变成野指针
// Test t(100);
// Test &rt = t;
// return &rt; // 同上
Test *t = new Test(100);
return t; // 较好
}
void f () {
Test t = getTest1();
cout << t.get() << endl;
// Test t = getTest2();
// cout << t.get() << endl;
// Test *pt = getTest3();
// cout << pt->get() << endl;
}
int main(int argc, char* argv[]) {
f();
return 0;
}
六、引用基本知识
引用的主要作用是: 1.函数形参 2. 函数返回值 3. const引用
int i = 100;
int &ri = i; // 引用的声明
cout << "ri=" << ri << endl;
int &rri = ri; // 这里的ri就是i,实际上相当于: int &rri = i;为i分配了第二个别名rri
cout << "rri=" << rri << endl;
int j = ri; // 相当于i=j
cout << "j=" << j << endl;
int k = 200;
const int &rk = k; // 常引用
//rk = 300; // 不能通过常引用去修改k
k = 300; // 但是我们可以直接修改k
cout << "rk=" << rk << endl; // 300
int &nrk = k; // k的第二个别名(注意是非const引用)
nrk = 400; // 通过nrk可以修改k,此时的rk跟着一起变
cout << "rk=" << rk << endl;
分享到:
相关推荐
个人认为比较经典(作者:用了几年java 了,突然想学习c++ ,昨天用了一天的时间疯狂的学习了一天c++ 基础知识,发现感觉还不错,不过精验告诉我,学编程语言一定要实践,在这里指记录了一些学习中的点滴。...
压缩包里面包含多个目录,包含了多种查找算法、递归的示例、堆栈使用、队列、二叉树、各种...此资源都是我在学习C++过程中写的代码,记录了学习过程中的点滴,希望对你有帮助,比较适合C++初学者或者数据结构初学者。
C_C++程序设计教程.面向对象分册(第2版)[郑秋生][电子教案]
学习编程的软件其实挺多的,这⾥主要跟⼤家介绍C/C++,Java,Python,前端⽹页,Linux这5个⽅⾯,希望能帮到想利⽤点滴看⼿机 的时间学习的你 1、C/C++ 这⾥介绍⼀个软件—C++编译器(c4droid),可以直接编辑运⾏C/...
好资源共享,希望对你的学习能有点滴的帮助.
在IAR中编程序时时常用到自己编写的头文件,这时需要设置添加包含头文件的路径的。常用方法是在工程上单击右键选择options,在c/c++ complier 设置里面的preprocessor中加载你的头文件路径。
这个是图的基本操作,希望能够帮助正在学习数据结构的你
包含kdevelop使用手册,KDevelop编程环境教程,kdevelop的点滴收获,kdevelop应用实例,Linux下C开发环境的构成和安装,安装KDevelop开发第一个C-C++程序,走进Linux编程的大门,Linux开发环境必备十大开发工具等...
https://pan.baidu.com/s/1dEUQRRz#list/path=/ 这个是百度云链接的地址 CSDN 不允许0分下载了,只好先择最低的 2 分了
4.3 C、C++的学习方式 187 4.3.1 从BASIC到C 187 4.3.2 C、汇编、API的关系 187 4.3.3 接口的建立方法 190 4.4 挂钩技术 201 4.4.1 Windows上C的挂钩 201 4.4.2 C++的挂钩技术 213 第5章 代码的规范和风格 220 5.1 ...
MFC的TabCtrl控件,是我们在项目中常用的,它可以实现界面切换的效果,作为小白,在学习的过程中记录自己的点滴过程,对自己也是一种成长。
4.3 C、C++的学习方式 187 4.3.1 从BASIC到C 187 4.3.2 C、汇编、API的关系 187 4.3.3 接口的建立方法 190 4.4 挂钩技术 201 4.4.1 Windows上C的挂钩 201 4.4.2 C++的挂钩技术 213 第5章 代码的规范和风格 220 5.1 ...
此代码仓库本质上是由多个有代表性的子项目整合而成的超级集索引,这里记录了我自学习编程以来所学所做的冰山一角。 相关的子项目代码目前以 C/C++、Java、Python 为主。涉及到的领域谈不上包罗万象,但毕竟是我多年...
C++ 泛型编程系列讲座之实施 泛型技巧系列:简单类型选择器 C# 泛型简介 我眼中的C#2.0新功能特性 泛型技巧系列:避免基类及接口约束 New Article 不该用Generics实现Abstract Factory的理由 C#2.0-泛型 C#2.0-...
Android系统开发工程师常常需要深入理解系统的运转过程,而本书所涉及的内容可能正是他们在工作和学习中最想了解的。那些对具体模块(如Audio系统和Surface系统)感兴趣的读者 也可以直接阅读相关章节的内容。 ...