c++学习点滴2
来源:互联网 发布:打电话变音软件下载 编辑:程序博客网 时间:2024/05/16 16:20
一、函数指针
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'): -1function pointer: -1function pointer: -1myfun: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分配了第二个别名rricout << "rri=" << rri << endl;int j = ri; // 相当于i=jcout << "j=" << j << endl;int k = 200;const int &rk = k; // 常引用//rk = 300; // 不能通过常引用去修改kk = 300; // 但是我们可以直接修改kcout << "rk=" << rk << endl; // 300int &nrk = k; // k的第二个别名(注意是非const引用)nrk = 400; // 通过nrk可以修改k,此时的rk跟着一起变cout << "rk=" << rk << endl;
- 《C语言点滴》学习笔记(2)
- C学习点滴
- 《C语言点滴》学习笔记
- C语言点滴学习笔记
- USB Type-C学习点滴
- Objective-C基础教程(第2版)学习记录点滴
- js学习点滴2
- c++学习点滴2
- clojure学习点滴2
- C语言学习的点滴积累
- C语言学习路上点滴之一
- 学习C语言的点滴(1)
- 【C学习点滴】NULL是指针
- 每天学习的点滴--c和指针
- 《C语言点滴》学习笔记(1)
- c点滴
- c 点滴
- 良葛格java学习点滴2
- 使用MATLAB的MCC命令生成C/C++程序 C++错误知识
- 奇异值分解 SVD 图像压缩 Matlab 压缩率
- 物理和数学
- ASP.NET面试题(推荐_有答案)
- Mini-XML学习笔记
- c++学习点滴2
- EL empty表达式
- linux kernel : RCU 读-拷-更新的同步机制
- iOS 程序中调用系统自带应用(短信,邮件,浏览器,地图,appstore,拨打电话)
- Android手机主流屏幕分辨率
- Linux内核中的内存(一)
- 看着杨大师的采访,学到了一些东西
- 今天在做级联删除的时候出现org.hibernate.PropertyValueException错误
- df