C++ 基础复习 1
2016-03-13 16:17
246 查看
1. 友元
友元的作用是,友元函数内部可以直接访问外围类的private的字段或方法。通俗的理解就是解决了访问权限的问题。1) 有点像java的内部类,但是只能在外围类中声明,定义(实现)部分要写在外围类外面,否则编译报错:
类定义不能被声明成友元
2) 不仅类可以这样使用,函数也可以这样使用
3) 友元函数要想访问外围函数中的字段,则需要在友元函数的参数中里 有外围类的引用,比如:
string toString(Person &person);
2. 指针与引用
c++中 & * 这两个操作符好麻烦, 浅谈C++中指针和引用的区别这篇文章总结的不错,比较清晰。
1) 指针作为函数参数:
方法声明了指针类型的参数,调用时有两种情况比如方法声明如下:
void test(int* p){ int a = 1; p = &a; cout<<p<<" "<<*p<<endl; }
调用test时,
可以传递&x(假设定义了 int x = 100;),即test(&x);
也可以传递p1(假设定义了 int* p1 = NULL;),即test(p1);
第一种情况传递的是x的地址,test函数内的操作会对x产生影响
第二种情况传递的是p1的值,传值,将p1的值复制了一份传递给了test,test函数内的操作不会对外面的p1指针值产生影响,p1的值仍然是NULL。
完整程序如下:
#include<iostream>
using namespace std;
void test(int* p){ int a = 1; p = &a; cout<<p<<" "<<*p<<endl; }
int main(void){
int *p = NULL;
test(p);
if (p == NULL){
cout<<"P is null"<<endl;
}
return 0;
}
2) 引用作为函数参数传递
这是比较易混淆的void test(int &a);
声明时时int型的引用(可以理解成变量名),调用时直接送变量名就可以:
代码如下:
#include<iostream> using namespace std; void test(int &a){ cout<<&a<< " "<<a<<endl; } int main(void){ int a = 100; test(a); cout<<&a<< " "<<a<<endl; return 0; }
输出结果为:
0x7fff313b99ac 100
0x7fff313b99ac 100
这足以说明用引用进行参数传递时,事实上传递的是实参本身,而不是拷贝。
3) 引用与指针连起来作为函数参数
直接看示例代码:#include<iostream> using namespace std; void test(int *&p){ int a = 100; p = &a; cout<<p<<" "<<*p<<endl; } int main(void){ int *p1 = NULL; test(p1); cout<<p1<<" "<<*p1<<endl; return 0; }
结果:
0x7fff634ba3bc 100
0x7fff634ba3bc 100
也就是指针加引用连起来用,可以改变外围指针的值
4) 指针与指针连起来作为函数参数
另:
指针是地址,引用是变量名;
指针可以多级,引用不能多级;
引用只能在定义时被初始化一次,之后不可变;指针可变;
引用使用时无需解引用(*),指针需要解引用;
对于类来说:变量直接声明 后可以赋给引用,使用new之后可以赋给指针(当然对于类的指针,除了new之外还可以用&变量名的方式(传统方式))
引用用点号调用其方法,指针用->调用其方法
代码如下:
int main(){ Person p; Person &r = p; cout<<r.getAge()<<endl; Person *p1 = new Person(); cout<<p1->getAge()<<endl; return 0; };
3. 编译问题
1) ubuntu 上编译报错: undefined reference to `std::cout'…参见这篇,用g++ 而不是gcc
2) mac上编译报错:
Undefined symbols for architecture x86_64:
"std::__1::locale::use_facet(std::_…………
上一篇已经提到。
相关文章推荐
- 操作系统可变分区用C语言实现按最佳适应算法分配内存
- utilities(C++)——单例(Singleton) (使用智能指针 shared_ptr)
- C++ decltype类型说明符
- 逗号运算符与加加减减
- C和C++ const的声明差异
- 浅谈C++内联函数
- C++ decltype类型说明符
- C++ decltype类型说明符
- Cygwin下 vim编写 C / C++
- C++ auto类型说明符
- utilities(C++)——单例(Singleton)
- c++实现线程池
- C++基础::构造函数
- c++ 小知识点
- lesson 01 Hello Sdl
- c++的上机作业2
- c++上机作业1
- ROS基础学习笔记——工作空间、CMakeList、package.xml
- C++命名空间详解std
- Simplified Memory Modle C/C++内存模型